我可以安全地将“CoreData无法满足错误”包装在@try catch块中吗?

6
我理解为什么会出现这个错误:当您尝试访问在另一个线程的托管对象上下文中被删除的CoreData对象时,因此设置为“fault”对象,并且任何保留的引用将不再指向有效的CoreData对象。
我正在使用NSFetchedResultsController。
我已确认所有代码都已正确实现。我有两个托管对象上下文,一个用于BG线程,一个用于主线程。
我已确认主线程已订阅了NSManagedObjectContextDidSaveNotification下的通知。
我已确认当此通知触发时,我在主线程托管对象上下文上执行mergeChangesFromContextDidSaveNotification:。
我没有在任何地方保留这些对象,但我正在为NSFetchRequest设置批处理大小(这可能是问题吗?)
然而,我仍然偶尔会收到“CoreData无法满足故障”的错误消息。
在我的特定应用程序中,这通常发生在一种“数据绑定”过程中,因此我可以安全地丢弃故障对象并继续。我想通过在数据绑定循环内部包装@try-catch块来完成此操作,只跳过我收到CoreData错误的行。
我可以用CoreData安全地这样做吗?还是在遇到故障后我需要完全丢弃托管对象上下文?
我已经查看了关于如何检查CoreData对象是否为故障的问题,如果我不能安全地假设我的@try-catch块不会引起其他问题,那么可能需要实现这个功能。

我将它包装在 try catch 块中,似乎减少了崩溃的数量,但我不确定是否会有任何长期影响。 - eanticev
1个回答

15

不必使用try-catch,我们可以使用“existingObjectWithId”并检查返回的对象是否为空。

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

如果指定的ID已在上下文中注册,则返回该对象,否则将对象置于上下文中。如果无法获取对象,或对象不存在或无法放入,它将返回nil。与-objectWithID:不同,它永远不会返回故障。


这是一个不错的方法,但问题在于是否可以特别使用try和catch。不过我会给你一个+1 :) - eanticev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接