【发布时间】:2012-09-20 06:20:21
【问题描述】:
我的整个应用程序(包含两个实体)中有一个托管文档,用户可以从两个不同的视图控制器进行更新。每个视图控制器都有自己的 NSFetchedResultsController 属性来传递更改:一个视图控制器中的 UICollectionView 和另一个中的 UITableView。根视图控制器中的 UICollectionView 显示 Teams,而 segued 视图控制器中的 UITableView 显示该团队中的 Players。
当我在第一个视图控制器中时,我可以添加一个团队的实例,它可以正常工作,因为它将它们保存到文档中,然后将它们添加到 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:]: 尝试使用 userInfo (null) 从 objects[0] 插入 nil 对象"
我的 fetchedResultsController 肯定是 NSManagedObjectContextObjectsDidChangeNotification 的观察者,但是这个错误发生在托管对象上下文发生任何变化之前。所以我基本上无法确定托管对象上下文在什么时候得到 null userInfo。
(发生的另一件事是我的 NSFetchedResultsController 来自具有 UICollectionView 的根视图控制器,在下一个具有 UITableView 的视图控制器中的 NSFetchedResultsController 触发它自己之前触发其委托方法。我认为这是正确的功能,因为团队和玩家都在 CoreData 中获得更新)。
关于为什么 UITableView 行插入会导致此错误,或者我的单个托管文档如何存在可能导致此错误的不一致,有什么想法吗?
【问题讨论】:
标签: ios ipad core-data nsfetchedresultscontroller uimanageddocument