很长一段时间我都遇到了一个奇怪的错误,我的大部分桌面视图都变黑了(只剩下几个单元格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];
}
答案 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