Ios 如何创建/管理多个ManagedObjectContext?
我有一个问题,我很有信心,我从广义上知道它是什么以及如何解决它,但我不确定,也没有找到实现解决方案的干净/最佳实践方法 我的问题是:我正在使用dispatch_async将文件中的一些数据加载到后台线程中的核心数据模型中,这可以正常工作,除非我在GUI中执行的操作也会影响模型,然后砰的一声,例如:Ios 如何创建/管理多个ManagedObjectContext?,ios,core-data,Ios,Core Data,我有一个问题,我很有信心,我从广义上知道它是什么以及如何解决它,但我不确定,也没有找到实现解决方案的干净/最佳实践方法 我的问题是:我正在使用dispatch_async将文件中的一些数据加载到后台线程中的核心数据模型中,这可以正常工作,除非我在GUI中执行的操作也会影响模型,然后砰的一声,例如: 'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.' 。。。我认为这是由于两个
'NSGenericException', reason: '*** Collection ... was mutated while being enumerated.'
。。。我认为这是由于两个线程在同一ManagedObjectContext中处理数据造成的,因为我目前只使用一个线程
我读过的所有文章和答案都告诉我应该为后台线程使用单独的ManagedObjectContext,但是如何/在何处设置它呢
我当前在我的应用程序委托中创建PersistentStoreCoordinator和(一个)ManagedObjectContext,并将ManagedObjectContext传递给我的(唯一的)视图协调器。它又将其传递给后台数据加载任务(这是我的一个模型类的类方法),从而导致问题
我应该吗
我仍然无法始终如一地重现这个问题;它似乎高度依赖于时间。但以下是我为防止它所做的努力 在视图控制器中:
- (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,所以我假设不显式释放本地创建的上下文就可以了?您能添加一些代码吗?尤其是生成异常的代码。你说得对,你应该小心地在线程之间管理你的NSManagedObjectContext对象,但不管怎样,看到你的代码真的很好。我还没有成功地重复创建完全相同的异常,我引用的就是一个例子。但每当我遇到问题时,总是在GUI中执行某些操作时,会更改ManagedObjectContext中的某些内容,而后台任务则在同一上下文中加载和保存数据。