6

我理解为什么会发生此错误:当您尝试访问在另一个线程上的托管对象上下文中删除的 CoreData 对象时,因此被设置为“故障”对象,因此任何保留的引用将不再指向有效的核心数据对象。

我正在使用 NSFetchedResultsController。

我已确认所有代码均已正确实施。我有 2 个托管对象上下文,一个用于 BG 线程,一个用于主线程。

我已经确认主线程订阅了 NSManagedObjectContextDidSaveNotification 下的通知。

我已确认当此通知触发时,我会在主线程托管对象上下文中执行 mergeChangesFromContextDidSaveNotification:。

我没有在任何地方保留这些对象,但我正在为 NSFetchRequest 设置批处理大小(这可能是问题吗?)

然而,我仍然偶尔会收到“CoreData 无法完成错误”错误。

在我的特定应用程序中,这通常发生在某种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续前进。我想通过将数据绑定的循环内部包装在 @try-catch 块中并跳过我得到 CoreData 错误的行来做到这一点。

我可以用 CoreData 安全地做到这一点吗?或者我是否需要在遇到故障后完全转储托管对象上下文。

我确实检查了这个关于如何检查 CoreData 对象是否为错误的问题,如果我不能安全地假设我的 @try-catch 块不会导致其他问题,这可能是我实现的。

4

1 回答 1

15

我们可以使用“existingOjectWithId”并检查返回对象上的 nil,而不是使用 try-catch。

- (NSManagedObject*)existingObjectWithID:(NSManagedObjectID*)objectID error:(NSError**)error 

如果已在上下文中注册,则上面返回指定 ID 的对象,或者将对象错误地放入上下文中。如果对象无法获取、不存在或无法出错,则返回 nil。与 -objectWithID 不同:它从不返回错误。

于 2013-08-14T07:03:55.310 回答