在@synchronized代码块中进行提取和在锁定的NSManagedObjectContext中进行提取之间有什么不同

时间:2013-01-24 10:32:14

标签: ios multithreading core-data nsmanagedobjectcontext

我已经阅读了有关@synchronized和关于NSManagedObjectContext的Apple文档,但我根本没有看到这些内容。

有人能解释一下这两段代码之间的区别:

这里我们有一个关键部分,我们在其中查询NSManagedObjectConext

    @synchronized(self) {
        array = [mainContext executeFetchRequest:request error:&error];
        if (error != nil) {
            NSLog(@"Obj list fetch error: %@", error);
            exit(-1);
        }
    }

在这里,我们在锁定的NSManagedObjectConext

中执行相同的查询
    [mainContext lock];
        array = [mainContext executeFetchRequest:request error:&error];
        if (error != nil) {
            NSLog(@"Obj list fetch error: %@", error);
            exit(-1);
        }

    [mainContext unlock];

每个代码块有什么含义?哪一个是正确的?

非常感谢,我有点困惑。

1 个答案:

答案 0 :(得分:0)

如第一条评论中所述,这是两种不同类型的锁。 一个是阻止对你的类的整个实例的其他线程访问,直到你完成。这意味着您无法调用此类的其他方法,或者更好的是,阻止发送给实例的消息。

另一个锁只是阻止访问您的NSManagedObjectContext。

然而,Apple表示没有必要同步上下文。相反,如果您有多个NSManagedObjectContext共享一个NSPersistenceStoreCoordinator,则最好锁定协调器。