我有一个问题,我非常有信心,我从广义上知道它是什么以及如何解决它,但我不确定并且没有找到干净/最佳实践方法来实现解决方案是。
我的问题:我正在使用dispatch_async在后台线程中将文件中的一些数据加载到我的核心数据模型中,除非我在GUI中执行同样影响模型然后爆炸的事情,否则它会正常工作,例如:< / p>
'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.'
...我假设是由于两个线程在同一个ManagedObjectContext中弄乱数据,因为我现在只使用一个。
我读过的所有文章和答案告诉我,我应该为后台线程使用单独的ManagedObjectContext,但是如何/在何处设置它?
我目前在App Delegate中创建了PersistentStoreCoordinator和(one)ManagedObjectContext,并将ManagedObjectContext传递给我的(仅)View Coordinator。它又将它传递给后台数据加载任务(这是我的一个模型类的类方法),从而导致问题。
我应该
答案 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,所以我假设没有明确释放本地创建的上下文是好的吗?)