Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/121.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 此方法是否会导致并发问题?_Iphone_Ios_Core Data_Concurrency_Nsmanagedobjectcontext - Fatal编程技术网

Iphone 此方法是否会导致并发问题?

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

我有一个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子类和后台线程调用此方法,并传入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上进一步同步不会有任何好处,因为每个线程都是不同的对象