Core data 核心数据:删除引用已删除对象的NSOperation中的“NSObjectInaccessibleException”

Core data 核心数据:删除引用已删除对象的NSOperation中的“NSObjectInaccessibleException”,core-data,concurrency,nsmanagedobject,nsmanagedobjectcontext,nsoperation,Core Data,Concurrency,Nsmanagedobject,Nsmanagedobjectcontext,Nsoperation,我的应用程序有NSOperation子类,用于获取和操作托管对象。我的应用程序还定期从数据库中清除行,这可能会导致以下竞争条件: 后台操作从特定于线程的上下文中获取一组对象。它将迭代这些对象,并对它们的属性进行处理。 将删除主托管对象上下文中的一组行。 后台操作访问从主上下文中删除的对象的属性。这导致出现“NSObjectionaccessibleException”,原因是:“CoreData无法实现故障” 理想情况下,即使在主上下文中删除了一个对象,也可以对NSO操作获取的对象进行操作。我认

我的应用程序有NSOperation子类,用于获取和操作托管对象。我的应用程序还定期从数据库中清除行,这可能会导致以下竞争条件:

后台操作从特定于线程的上下文中获取一组对象。它将迭代这些对象,并对它们的属性进行处理。 将删除主托管对象上下文中的一组行。 后台操作访问从主上下文中删除的对象的属性。这导致出现“NSObjectionaccessibleException”,原因是:“CoreData无法实现故障” 理想情况下,即使在主上下文中删除了一个对象,也可以对NSO操作获取的对象进行操作。我认为实现这一目标的最佳方法是:

调用[request setReturnsObjectsAsFaults:NO]以确保核心数据不会尝试为主上下文中不再存在的对象执行错误。这里的问题是我可能需要访问对象的关系,据我所知,这仍然是错误的。 预先迭代托管对象,并将需要的属性复制到单独的非托管对象中。这里的问题是,我认为我需要同步/锁定此部分,以防在完成复制之前在主上下文中删除对象。
我错过了什么明显的东西吗?看来我想要完成的事情并不是太不寻常。谢谢你的帮助。

你说每个线程都有自己的上下文。那很好。然而,它们还需要与彼此的更改保持同步,这取决于它们的层次结构

是将所有存储分配给同一个持久存储协调器,还是它们具有父/子关系


同级应监视来自其他同级的NSManagedObjectContextObjectsIDChangeNotification。当子上下文保存时,家长会自动收到通知。

我通过在同一队列上执行抓取和删除操作来缓解这一问题。

好问题,我只能提供部分答案,我也很想知道这一点。不幸的是,您自己的解决方案更多的是一种变通方法,而不是真正的答案。如果后台操作很长,而您无法在主线程上运行它,该怎么办

我可以说的一件事是,您不必调用[request setReturnsObjectsAsFaults:NO],因为获取请求会将数据加载到行缓存中,并且在为其中一个获取的对象触发错误时不会返回到数据库请参阅Apple文档了解NSFetchRequest。但这对人际关系没有帮助

我尝试了以下方法:

在NSManagedObjectContextWillSave通知上,等待当前后台任务完成,并防止新任务从以下内容开始

-(void)contextWillSave:(NSNotification *)notification {
    dispatch_sync(self.backgroundQueue, ^{
        self.suspendBackgroundOperation = YES;
    });
}
取消NSManagedObjectContextDidSave通知上的suspendBackgroundOperation

然而,dispatch\u sync调用引入了可能的死锁,因此这也不能真正起作用。另外,在一个可能很长的后台操作完成之前,它仍然会阻塞主线程