NSFetchedResultsController试图插入nil对象?

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

CoreData:错误:严重的应用程序错误。 在调用-controllerDidChangeContent:期间,从NSFetchedResultsController的委托中捕获到exception。 * – [__ NSArrayM insertObject:atIndex:]:对象不能为userInfo为空(null)

它停在我的controllerDidChangeContent:方法的[tableView endUpdates]行上。 然后,如果我单击继续,应用程序不会崩溃,但用户交互变得非常缓慢。 我看了整个地方,因为这个例外的原因可能找不到任何东西。 任何线索?

我的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]; } 

我最终要求与苹果公司进行TSI,这是我得到答案的要点:

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

在这种情况下,Core Data通过-controllerDidChangeContent:方法捕获exception,这是由于尝试使用-insertObject:atIndex将nil放入NSMutableArray引起的。

所以基本上我的代码抛出exception,而不一定是核心数据框架。 我仍然找不到exception的根本原因,所以建议:

multithreading错误是导致神秘核心数据问题的最常见原因。

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

为什么在[tableView endUpdates];之后更新UI [tableView endUpdates]; ? 为什么你在一个单独的选择器上做延迟?

这对我来说似乎是非常值得怀疑的设计,也可能是你遇到问题的原因。 我强烈建议您在指定的方法中执行NSFetchedResultsControllerDelegate生成的所有UI更新。

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