3

我的整个应用程序(包含两个实体)中有一个托管文档,用户可以从两个不同的视图控制器更新它。每个视图控制器都有自己的 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 行插入为何导致此错误的任何想法,或者我的单个托管文档如何可能存在可能导致此错误的不一致?

4

2 回答 2

7

NSFetchedResultsChangeInsert事件的情况下,indexPathisnilnewIndexPath是插入对象的目​​标路径。因此你必须打电话

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]
                      withRowAnimation:UITableViewRowAnimationAutomatic];

对于更新事件。

于 2012-09-20T11:02:44.853 回答
0

NSManagedContext 只能使用'save:error:' 保存 - 你为什么要如图所示进行'文档保存'?

于 2012-09-20T11:21:03.280 回答