2011-06-01 62 views
0

我有一个用于保存管理对象上下文和照顾的任何错误的一类方法的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子类和后台线程这种方法,并传入的的的NSManagedObjectContext实例线程/ NSOperation。

我担心的是这样的:

如果线程A调用这个方法,虽然这种方法在执行中途,线程B调用它。当然还有另一个MOC。这种干涉有什么危害?从我的角度来看,它不会,因为这种方法只会与调用线程的“私有”或“拥有”的MOC实例进行通信。但是,如果多个线程同时执行同一段代码,即使某个方法中的局部变量也会“混淆起来”,令我感到恼火的是。还是每个变量都有自己的“上下文”在一个新的线程中,有它自己的堆(或堆栈,就此而言)的内存?

如果我把这个保存代码直接放到NSOperation子类和后台线程中,它会产生很大的不同吗?为什么?

回答

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关于同步。

2

规则是每个线程都必须有自己的moc。

查看Apple's Guidelines了解更多信息。

+0

是的,每个线程都有自己的MOC。所以如果一个线程调用[CoreDataUtilities saveContext:myMOC]那么会有问题吗?问题是关于多个线程将他们自己的MOC传递给这个单一的保存方法。 – 2011-06-01 21:30:17

+0

如果你在每个线程上有一个moc,你不需要担心重叠的保存调用,因为在moc下面苹果处理并发。在moc上进一步同步不会有任何好处,因为它对于每个线程都是不同的对象 – 2011-06-01 22:51:49

相关问题