NSFetchedResultsController试图插入nil对象?

时间:2012-11-29 09:17:50

标签: iphone ios core-data

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

  

CoreData:错误:严重的应用程序错误。抓住了一个例外   在调用期间来自NSFetchedResultsController的委托   -controllerDidChangeContent :. * - [__ NSArrayM insertObject:atIndex:]:对象不能为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];
}

3 个答案:

答案 0 :(得分:3)

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

  

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

     

在这种情况下,Core Data从您的网站中获取了一个例外   -controllerDidChangeContent:方法,是由于尝试使用-insertObject:atIndex将nil放入NSMutableArray引起的。

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

  

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

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

答案 1 :(得分:0)

为什么在[tableView endUpdates];之后更新用户界面?为什么要在单独的选择器上进行延迟?

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

答案 2 :(得分:0)

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