4

很长一段时间以来,我遇到了一个奇怪的错误,我的大部分表格视图都变黑了(只有几个单元格保持http://cl.ly/LFlS),而在其他视图中(连接到同一个 MOC)还有一些其他的视觉出现故障:http ://cl.ly/LH3c (注意重复的部分标题)。我一直认为这是 CoreData 的一个错误,但直到今天它被连接到调试器时我才得以重现它。这是我在它发生之前得到的例外:

CoreData:错误:严重的应用程序错误。在调用 -controllerDidChangeContent: 期间,从 NSFetchedResultsController 的委托中捕获了一个异常。 * -[__NSArrayM insertObject:atIndex:]: 对象不能为 nil 和 userInfo (null)

[tableView endUpdates]它在我的controllerDidChangeContent:方法中停止了。然后,如果我单击继续,应用程序不会崩溃,但用户交互会变得非常缓慢。我四处寻找可能是导致该异常的原因,但找不到任何东西。有什么线索吗?

我的 NSFetchedResultsController 更改处理看起来很像 Apple 的样板文件。我的 NSFRC 的 init 如下所示:

NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Artist" inManagedObjectContext:[SWDataManager sharedManager].mainObjectContext];
[request setEntity:entity];

[request setFetchBatchSize:100];

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"sortName" ascending:YES selector:@selector(localizedCaseInsensitiveCompare:)];
[request setSortDescriptors:@[sortByName]];

fetchedResultsController = [[NSFetchedResultsController alloc]
                            initWithFetchRequest:request
                            managedObjectContext:mainObjectContext
                            sectionNameKeyPath:@"firstLetter"
                            cacheName:nil];

fetchedResultsController.delegate = self;
[self refreshDataSource]; // set fetch request predicate and call performFetch on NSFRC
return fetchedResultsController;

编辑:我可以补充一点,这肯定发生在一堆对象从我的 MOC 中删除之后,因此从表视图中删除。

根据要求,我的controllerDidChangeContent:代码:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
    [self.tableView endUpdates];

    // this updates the section index and footer cell and other kind of stuff
    [self performSelector:@selector(layoutSpecialCells) withObject:nil afterDelay:0.3];
}
4

3 回答 3

3

我最终向 Apple 申请了 TSI,这是我得到的答案的要点:

为了保护数据存储的完整性,Core Data 会捕获一些在其操作期间发生的异常。有时这意味着如果 Core Data 通过委托方法调用您的代码,Core Data 最终可能会捕获您的代码抛出的异常。

在这种情况下,Core Data 通过您的 -controllerDidChangeContent: 方法捕获了一个异常,该异常是由尝试使用 -insertObject:atIndex 放入nilNSMutableArray 引起的。

所以基本上这个异常是由我的代码引发的,而不一定是由核心数据框架引发的。我仍然找不到异常的根本原因,所以建议:

多线程错误是神秘 Core Data 问题的最常见原因。

走了很长一段路,我意识到我的一些核心数据代码没有封装在performBlock:调用中。一旦我解决了这个问题,我就再也没有看到这个问题再次发生。

于 2013-01-25T22:05:24.070 回答
0

为什么之后更新UI [tableView endUpdates];?为什么要延迟在单独的选择器上执行此操作?

在我看来,这似乎是非常有问题的设计,并且可能是您遇到问题的原因。我强烈建议您在指定的方法中执行由 NSFetchedResultsControllerDelegate 生成的所有 UI 更新。

于 2012-11-30T13:26:19.110 回答
0

我们可能没有完全相同的问题,但您描述的错误与我的相同。当你看到这个时,我正在使用一些不存在的较新的 API,但我想我解决了我的问题。如果您好奇,请查看更新 5。NSFetchedResultsController 试图插入 nil 对象

于 2013-10-23T22:41:46.593 回答