1

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

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

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

...我认为这是由于两个线程弄乱了同一个 ManagedObjectContext 中的数据,因为我目前只使用一个。

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

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

我是不是该

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

1 回答 1

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,所以我假设不明确释放本地创建的上下文是可以的?)

于 2012-10-18T09:33:41.947 回答