我的整个应用程序(包含两个实体)中有一个托管文档,用户可以从两个不同的视图控制器更新它。每个视图控制器都有自己的 NSFetchedResultsController 属性来传递更改:一个视图控制器中的 UICollectionView 和另一个中的 UITableView。根视图控制器中的 UICollectionView 显示团队,而 segued 视图控制器中的 UITableView 显示该团队中的玩家。
当我在第一个视图控制器中时,我可以添加一个团队的实例,它可以正常工作,因为它将它们保存到文档中,然后将它们添加到 UICollectionView。当我在第二个视图控制器中时,我将 Player 插入 CoreData 并调用:
[document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:nil];
这会正确调用 NSFetchedResultsControllerDelegate 方法:-(void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
在这个委托方法中,我调用:
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
但是,在表视图上调用此行插入方法会导致以下 Core Data 错误:
“CoreData:错误:严重的应用程序错误。在核心数据更改处理期间捕获了异常。这通常是 NSManagedObjectContextObjectsDidChangeNotification 观察者中的一个错误。 * -[__NSPlaceholderArray initWithObjects:count:]:尝试从对象 [0] 插入 nil 对象用户信息(空)"
我的 fetchedResultsController 肯定是 NSManagedObjectContextObjectsDidChangeNotification 的观察者,但是这个错误发生在托管对象上下文的任何更改之前。所以我基本上无法确定托管对象上下文在哪一点得到 null userInfo。
(发生的另一件事是我的 NSFetchedResultsController 来自具有 UICollectionView 的根视图控制器,在下一个具有 UITableView 的视图控制器中的 NSFetchedResultsController 触发它自己之前触发其委托方法。我认为这是正确的功能,因为 Team 和 Player 都在 CoreData 中获得更新)。
关于 UITableView 行插入为何导致此错误的任何想法,或者我的单个托管文档如何可能存在可能导致此错误的不一致?