0

所以我几乎已经弄清楚了这件事,但是当我从搜索表后输入的详细视图更新我的 managedObjectContext 时,我绊倒了 NSFetchedResultsChangeUpdate。

我有一个从核心数据集生成的表格视图。我可以从此表中输入详细视图并毫无问题地进行更改。我也可以搜索表格并在大多数情况下进行更改而不会出现任何问题。但是,在某些对象上,我收到“在核心数据更改处理期间捕获到异常”。

我将此追踪到 NSFetchedResultsChangeUpdate。我正在使用以下代码:

case NSFetchedResultsChangeUpdate:
if (searchTermForSegue)
{
NSLog(@"index info:%@.....",theIndexPath);
NSLog(@"crashing at the next line");
[self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
break;
} else {
[self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath]; }
break;

当不搜索表时,它会运行 else 方法,并且 100% 的时间都有效。当表被搜索时,它运行 if (searchTermForSegue) 并且大部分时间都有效,但并非总是如此。我记录了 IndexPath 并发现了以下内容:

当它工作时,theIndexPath 正确地报告了对象 indexPat,当它失败时,错误的 theIndexPath 被调用了。例如,如果我将 tableView 缩小为 3 个部分,第一个是 2 个项目,第二个是 1 个,第三个是 1 个,我会得到以下 nslog:

On first object: index info:<NSIndexPath 0xb0634d0> 2 indexes [0, 0].....
on second object: index info:<NSIndexPath 0xb063e70> 2 indexes [0, 1].....
on third object: index info:<NSIndexPath 0xb042880> 2 indexes [1, 0].....
but on the last object: index info:<NSIndexPath 0x9665790> 2 indexes [2, 17]..... 

它应该调用 [2, 0]

请注意,我只是更新这些对象,而不是删除它们或添加新对象。

任何想法将不胜感激!

4

1 回答 1

-1

好的,我想出了一个似乎可以解决问题的技巧,但这似乎不是解决问题的最佳方法!有什么想法吗?

我发现当从基表调用 NSFetchedResultsChangeUpdate 时,它​​只被调用一次,但是当它从搜索/过滤的表中调用时,它被调用了两次(似乎 100% 的时间 - 我想这是为了刷新搜索到的表和非搜索表?)。此外,第一次调用似乎总是具有不正确的 indexPath,而第二次调用具有正确的信息。如果不正确的 indexPath 超出范围,第一次调用会使应用程序崩溃。

如果 NSFetchedResultsChangeUpdate 从搜索的表中执行以下操作,我的“修复”是忽略第一个调用

在tableview.h文件的界面中添加:

int             changeCall;

然后,在 tableview.m 文件中,在 loadView 中:

changeCall = 0;

然后我将 NSFetchedResultsChangeUpdate 更新为:

case NSFetchedResultsChangeUpdate:
        if (searchTermForSegue)
        {
            if (changeCall == 0) {
                changeCall++;
                break;
            } else if (changeCall == 1){
                NSLog(@"index infocalledtwice:%@.....",theIndexPath);
                [self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
                changeCall = 0;
                break;
            } else { break; }
        } else {
            [self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
        }
        break;

本质上,使用 changeCall int 跳过搜索表更新中的第一个调用,但使用第二个调用实际更新内容。这不是解决此问题的最佳方法,但创可贴似乎有效。如果有人有更好的答案,我当然会很感激。

此外,通过跳过第一个 NSFetchedResultsChangeUpdate,未搜索的表不会更新以反映新值。我已通过在 searchDisplayControllerWillEndSearch 方法中添加重新加载表的调用来解决此问题:

- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
    [self setSearchTermForSegue:nil];
    [self.tableView reloadData];
}

谢谢!

于 2012-06-04T15:01:00.303 回答