所以我需要使用多线程的cora-data托管对象上下文。
我发现以下实现几乎是我所需要的。
我有2个问题:
我应该在哪里释放分配的MOC?我不想遍历应用程序中的每个函数线程并调用一个函数来释放MOC。
我宁愿编写该函数,并以某种方式使之生效,以便每个线程在退出之前都调用它。那可能吗 ?
以下实现足以实现核心数据并发吗?
-(void) StoreManagedObjectContextForCurrentThread:(NSManagedObjectContext*) context
{
[[[NSThread currentThread] threadDictionary] setObject: context forKey: AQPerThreadManagedObjectContext];
}
-(NSManagedObjectContext *) myManagedObjectContext {
NSManagedObjectContext * result = [[[NSThread currentThread] threadDictionary] objectForKey: AQPerThreadManagedObjectContext];
if ( result != nil )
return result;
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator!=nil)
{
NSManagedObjectContext * moc = [[NSManagedObjectContext alloc] init];
[moc setMergePolicy: NSMergeByPropertyObjectTrumpMergePolicy];
[moc setPersistentStoreCoordinator: coordinator];
[self StoreManagedObjectContextForCurrentThread:moc];
[moc release]; // now owned by the thread dictionary
return moc;
}
return nil;
}
最佳答案
在您提供的实现中,您没有办法在线程消失之前释放托管对象上下文,因为它的生存期是由线程字典决定的,并且该对象的生存期是由Foundation处理的,而不是由您处理的。
如果要管理对象的生存期,则需要管理它们的存储。这意味着不再使用-threadDictionary
。一种选择是将您的后台工作实现为NSOperation
子类,并在操作的整个生命周期内保持托管对象的上下文不变,但这可能与您当前拥有的内容有很大的不同。
关于iphone - 核心数据并发-NSManagedObjectContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4525402/