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

Mug*_*nth 6 iphone cocoa cocoa-touch core-data

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

在控制台上.当我调试它时,一切正常.所以我明白这就像种族问题.

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

sbo*_*oth 16

如果您的目标是Leopard或更高版本,那么Apple可以让您更轻松.

在生产者线程中,在主线程中创建一个与MOC具有相同PSC的MOC.您可以从此线程中的Web服务中提取对象,创建新对象,并将其保存为正常情况.

在消费者线程中,将控制器添加为NSManagedObjectContextDidSaveNotification的观察者.你的回调应该类似于:

- (void) managedObjectContextDidSave:(NSNotification *)notification
{
  NSManagedObjectContext *managedObjectContext = [notification object];
  if(managedObjectContext != self.managedObjectContext)
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:notification];
}
Run Code Online (Sandbox Code Playgroud)

这样,保存在生成​​器线程中的对象将自动拉入您的使用者线程中.

  • @Mugunth Kumar,因为他正在检查哪个上下文你​​可能应该为对象参数传递nil,你不要观察为bg线程而不是app delegate的上下文创建的新上下文. (2认同)