核心数据的生产者消费者问题

时间:2009-05-23 19:37:08

标签: iphone cocoa cocoa-touch core-data

我有一个核心数据应用程序。在生产者线程中,我从Web服务中提取数据并将其存储在我的对象中并调用save。 我的使用者对象是一个显示相同的表视图控制器。 然而,应用程序崩溃了,我得到了 NSFetchedResultsController错误:期望在节(null)中找到对象(实体:FeedEntry; id:0xf46f40; data :)以进行删除

控制台上的

。当我调试它时,一切正常。所以我明白这就像种族问题。

这些问题是如何解决的?使用核心数据设计生产者 - 消费者应用程序的最佳方法是什么?

2 个答案:

答案 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。