如何创建/管理多个ManagedObjectContexts?

时间:2012-10-17 23:13:18

标签: ios core-data

我有一个问题,我非常有信心,我从广义上知道它是什么以及如何解决它,但我不确定并且没有找到干净/最佳实践方法来实现解决方案是。

我的问题:我正在使用dispatch_async在后台线程中将文件中的一些数据加载到我的核心数据模型中,除非我在GUI中执行同样影响模型然后爆炸的事情,否则它会正常工作,例如:< / p>

'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.'

...我假设是由于两个线程在同一个ManagedObjectContext中弄乱数据,因为我现在只使用一个。

我读过的所有文章和答案告诉我,我应该为后台线程使用单独的ManagedObjectContext,但是如何/在何处设置它?

我目前在App Delegate中创建了PersistentStoreCoordinator和(one)ManagedObjectContext,并将ManagedObjectContext传递给我的(仅)View Coordinator。它又将它传递给后台数据加载任务(这是我的一个模型类的类方法),从而导致问题。

我应该

  1. 将PersistentStoreCoordinator传递给View Controller,以便它可以将它传递给后台任务,以便后台任务可以创建自己的本地ManagedObjectContext?
  2. 在App Delegate中创建一个ManagedObjectContexts池,并将它们全部传递给View Controller,以便它可以自己使用一个并将其他人分配给后台任务吗?
  3. 其他完全不同的东西?

1 个答案:

答案 0 :(得分:0)

我仍然无法始终如一地重现这个问题;它似乎高度依赖于时间。但这是我为防止它而采取的措施。

在视图控制器中:

- (void) loadNewStuff: (NSString *)stuffID
{
     dispatch_async(taskQueue, 
       ^(void){[MyModelClass loadNewStuff: stuffID withContext: myContext];}
     );
}

在模型类中:

+ (void) loadNewStuff: (NSString *)stuffID withContext: (NSManagedObjectContext *)passedContext
{
  NSManagedObjectContext *localContext = [[NSManagedObjectContext alloc] init];
  [localContext setPersistentStoreCoordinator: passedContext.persistentStoreCoordinator];

  // load new stuff, save local context, finished

}

......这没关系,还是我忽视了一些会让我吃得厉害的东西?

(我正在使用ARC,所以我假设没有明确释放本地创建的上下文是好的吗?)