Ios 我能安全地包装';CoreData无法实现故障';@try catch块中的错误

Ios 我能安全地包装';CoreData无法实现故障';@try catch块中的错误,ios,core-data,Ios,Core Data,我理解发生此错误的原因:当您尝试访问在另一个线程的托管对象上下文中删除的CoreData对象时,该对象因此被设置为“fault”对象,因此任何保留的引用将不再指向有效的CoreData对象 我正在使用NSFetchedResultsController 我已经确认所有代码都正确实现了。我有两个托管对象上下文,一个用于BG线程,一个用于主线程 我已确认主线程已订阅NSManagedObjectContextDidSaveNotification下的通知 我已经确认,当触发此通知时,我会在主线程管理

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

我正在使用NSFetchedResultsController

我已经确认所有代码都正确实现了。我有两个托管对象上下文,一个用于BG线程,一个用于主线程

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

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

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

然而,我仍然偶尔会出现“CoreData无法完成故障”错误

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

我可以安全地使用CoreData执行此操作吗?或者在遇到错误后是否需要完全转储托管对象上下文


我确实检查了这个问题,如果我不能安全地假设我的@try-catch块不会导致其他问题,这可能是我实现的。

我们可以使用“ExistingObjectWithId”代替try-catch,并在返回的对象上检查nil

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

如果指定ID的对象已在上下文中注册,或将该对象插入上下文中,则上述操作将返回该对象如果对象无法提取、不存在或无法出错,则返回nil。与-objectWithID不同:它从不返回错误。

您找到过解决方案吗?我将它包装在一个try-catch块中,它似乎减少了崩溃的数量,但我不确定这是否会产生任何长期影响。这是一个好方法,但问题是是否特别可能使用try-catch。不过我会给你一个+1:)