我有一个核心数据应用程序。在生产者线程中,我从Web服务中提取数据并将其存储在我的对象中并调用save。 我的使用者对象是一个显示相同的表视图控制器。 然而,应用程序崩溃了,我得到了 NSFetchedResultsController错误:期望在节(null)中找到对象(实体:FeedEntry; id:0xf46f40; data :)以进行删除
控制台上的。当我调试它时,一切正常。所以我明白这就像种族问题。
这些问题是如何解决的?使用核心数据设计生产者 - 消费者应用程序的最佳方法是什么?
答案 0 :(得分:16)
如果你的目标是Leopard或更高版本,Apple会让事情变得更轻松。
在生产者线程中,在主线程中创建一个与MOC具有相同PSC的MOC。您可以在此线程中从Web服务中提取对象,创建新对象,并将其保存为正常情况。
在您的使用者线程中,将控制器添加为NSManagedObjectContextDidSaveNotification的观察者。你的回调应该类似于:
- (void) managedObjectContextDidSave:(NSNotification *)notification
{
NSManagedObjectContext *managedObjectContext = [notification object];
if(managedObjectContext != self.managedObjectContext)
[self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
这样,保存在生产者线程中的对象将自动拉入您的消费者线程中。
答案 1 :(得分:0)
核心数据通常不是线程安全的。我倾向于在后台线程上做最小的工作,并在从Web服务检索后将创建Core Data实体所需的数据传递给主线程。但是,请查看this document。如果需要,有一些策略可以跨线程使用Core Data。