这种方法会导致并发问题吗?

时间:2011-06-01 21:10:53

标签: 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 error: %@, %@", error, [error userInfo]);
        } 
    }
}

我从NSOperation子类和后台线程调用此方法,并传入线程/ NSOperation的NSManagedObjectContext实例。

我担心的是:

如果线程A调用此方法,并且此方法正在执行中途,则线程B也会调用它。当然还有另一个MOC。以任何方式干扰这个?从我的观点来看,它不会,因为这个方法只与调用线程的“私有”或“拥有”的MOC实例进行通信。但令我恼火的是,当多个线程同时执行同一段代码时,方法中的局部变量会被“混淆”。或者每个变量在一个新线程中都有自己的“上下文”,它有自己的内存堆(或堆栈)吗?

如果我将此保存代码直接放入NSOperation子类和后台线程中会有很大的不同吗?为什么呢?

2 个答案:

答案 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了解详情。