我有一个CoreDataUtilities类,其类方法可以保存托管对象上下文并处理任何错误:
+ (void)saveContext:(NSManagedObjectContext*)moc {
NSError *error = nil;
if (moc != nil) {
if ([moc hasChanges] && ![moc save:&error]) {
NSLog(@"MOC save error: %@, %@", error, [error userInfo]);
}
}
}
我从NSOperation子类和后台线程调用此方法,并传入线程/ NSOperation的NSManagedObjectContext实例。
我担心的是:
如果线程A调用此方法,并且此方法正在执行中途,则线程B也会调用它。当然还有另一个MOC。以任何方式干扰这个?从我的观点来看,它不会,因为这个方法只与调用线程的“私有”或“拥有”的MOC实例进行通信。但令我恼火的是,当多个线程同时执行同一段代码时,方法中的局部变量会被“混淆”。或者每个变量在一个新线程中都有自己的“上下文”,它有自己的内存堆(或堆栈)吗?
如果我将此保存代码直接放入NSOperation子类和后台线程中会有很大的不同吗?为什么呢?
答案 0 :(得分:3)
为什么不在保存操作周围放置@synchronize(...)
块。这将确保如果托管对象上下文已经保存,则不会保存它。
+ (void)saveContext:(NSManagedObjectContext*)moc {
if (moc == nil) return;
@synchronized(moc)
{
NSError *error = nil;
if ([moc hasChanges] && ![moc save:&error])
NSLog(@"MOC save error: %@, %@", error, [error userInfo]);
}
}
在同步时阅读here。
答案 1 :(得分:2)
规则是每个线程必须有自己的moc。
查看Apple's Guidelines了解详情。