NSPrivateQueueConcurrencyType上下文只能在performBlock中运行?

时间:2012-07-11 15:42:27

标签: objective-c ios multithreading core-data concurrency

我想知道NSPrivateQueueConcurrencyType上下文是否只在-performBlock和-performBlockAndWait中运行。 和NSPrivateQueueConcurrencyType上下文返回的NSManagedObject无法在performBlock外部访问?

我在Apple doc“iOS 5.0中的新功能”中找到了以下句子

  

将消息发送到使用队列关联创建的上下文时,如果您的代码尚未在该队列上执行(对于主队列类型)或在performBlock的范围内,则必须使用performBlock:或performBlockAndWait:方法。 ..调用(对于私有队列类型)。在传递给这些方法的块中,您可以自由使用NSManagedObjectContext的方法。

如果是这样,为什么MagicalRecord和XMPPFramework不在块中操作上下文和NSManagedObject?

1 个答案:

答案 0 :(得分:4)

我不知道MagicalRecord和XMPPFramework中的代码是做什么或不做什么的。您需要通过他们的常规支持手段与他们联系。

但是,我可以告诉您,如果使用NSPrivateQueueConcurrencyType创建MOC,那么您应该访问MOC或该MOC拥有的托管对象的唯一方法是通过performBlock * API。

如果使用NSMainQueueConcurrencyType创建MOC,则可以在主线程中运行或通过performBlock * API访问它。

如果使用NSConfinementConcurrencyType创建MOC,则只能从创建MOC的线程访问MOC。如果未指定并发,则使用“限制”作为默认值。

这是目前创建MOC的唯一方法,以及使用它们的规则摘要。

我相信MagicalRecord使用限制并在每个线程中保留一个MOC,但我从未使用它,并且只查看了旧版本的代码库,因此随着嵌套上下文的出现它可能会发生很大变化。