Iphone 此方法是否会导致并发问题?
我有一个CoreDataUtilities类,它带有一个类方法,可以保存托管对象上下文并处理任何错误:Iphone 此方法是否会导致并发问题?,iphone,ios,core-data,concurrency,nsmanagedobjectcontext,Iphone,Ios,Core Data,Concurrency,Nsmanagedobjectcontext,我有一个CoreDataUtilities类,它带有一个类方法,可以保存托管对象上下文并处理任何错误: + (void)saveContext:(NSManagedObjectContext*)moc { NSError *error = nil; if (moc != nil) { if ([moc hasChanges] && ![moc save:&error]) { NSLog(@"MOC save erro
+ (void)saveContext:(NSManagedObjectContext*)moc {
NSError *error = nil;
if (moc != nil) {
if ([moc hasChanges] && ![moc save:&error]) {
NSLog(@"MOC save error: %@, %@", error, [error userInfo]);
}
}
}
我从NSOperation子类和后台线程调用此方法,并传入thread/NSOperation的NSManagedObjectContext实例
我关注的是:
如果线程A调用此方法,并且此方法正在中途执行,那么线程B也会调用它。当然是另一个主运行中心。这会有什么影响吗?从我的观点来看,它不会,因为这个方法只与MOC实例通信,而MOC实例无论如何都是“私有的”或“拥有的”。但让我恼火的是,当多个线程同时执行同一段代码时,即使是方法中的局部变量也会“混淆”。或者每个变量在一个新线程中都有自己的“上下文”,有自己的内存堆(或者堆栈)
如果我将此保存代码直接放入NSOperation子类和后台线程中,会有很大的不同吗?为什么?规则是每个线程必须有自己的moc
查看更多信息。规则是每个线程必须有自己的moc
查看以了解更多信息。为什么不在保存操作周围放置一个
@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]);
}
}
阅读同步。为什么不在保存操作周围放置一个
@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]);
}
}
阅读同步。是的,每个线程都有自己的MOC。因此,如果线程调用[CoreDataUtilities saveContext:myMOC],那么会有问题吗?问题在于,多个线程将自己的MOC传递给这个单一的保存方法。如果每个线程上都有一个MOC,那么就不必担心重复的保存调用,因为在MOC下面,apple处理并发。在moc上进一步同步不会有任何好处,因为每个线程都是不同的对象是的,每个线程都有自己的moc。因此,如果线程调用[CoreDataUtilities saveContext:myMOC],那么会有问题吗?问题在于,多个线程将自己的MOC传递给这个单一的保存方法。如果每个线程上都有一个MOC,那么就不必担心重复的保存调用,因为在MOC下面,apple处理并发。在moc上进一步同步不会有任何好处,因为每个线程都是不同的对象