我的整个应用程序(包含两个实体)中有一个托管文档,用户可以从两个不同的视图控制器进行更新。每个视图控制器都有自己的NSFetchedResultsController属性,用于将更改中继到:一个视图控制器中的UICollectionView和另一个视图控制器中的UITableView。根视图控制器中的UICollectionView显示Teams,而segued视图控制器中的UITableView显示该团队中的Players。
当我在第一个视图控制器中时,我可以添加一个团队的实例,它可以正常工作,因为它将它们保存到文档中,然后将它们添加到UICollectionView。当我在第二个视图控制器中时,我将一个Player插入到CoreData中并调用:
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
这正确调用NSFetchedResultsControllerDelegate方法: - (无效)控制器:didChangeObject:atIndexPath:forChangeType:newIndexPath:
在这个委托方法中,我打电话给:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
但是,在表视图上调用此行插入方法会导致以下Core Data错误:
“CoreData:错误:严重的应用程序错误。在Core Data更改处理期间捕获到异常。这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误。 * - [__ NSPlaceholderArray initWithObjects:count:]:尝试使用userInfo(null)“
从对象[0]插入nil对象我的fetchedResultsController肯定是NSManagedObjectContextObjectsDidChangeNotification的观察者,但是在管理对象上下文中的任何更改之前发生此错误。所以我基本上无法确定托管对象上下文在哪个位置获得null userInfo。
(另一件事是我的NSFetchedResultsController来自根视图控制器,它有UICollectionView,在下一个具有UITableView的视图控制器中的NSFetchedResultsController之前触发其委托方法,它自己激活。我认为这是正确的功能,因为团队和玩家都在CoreData中获得更新。
有关为什么UITableView行插入导致此错误的想法,或者我的单个托管文档可能会出现可能导致此问题的不一致的问题?
答案 0 :(得分:7)
对于NSFetchedResultsChangeInsert
事件,indexPath
为nil
, newIndexPath
是插入对象的目标路径。因此你必须致电
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
withRowAnimation:UITableViewRowAnimationAutomatic];
更新活动。