2

我想知道 NSPrivateQueueConcurrencyType 上下文是否仅在 -performBlock 和 -performBlockAndWait 内运行。从 NSPrivateQueueConcurrencyType 上下文返回的 NSManagedObject 不能在 performBlock 之外访问?

我从苹果文档“iOS 5.0 中的新功能”中找到了以下句子

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

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

4

1 回答 1

4

我不知道 MagicalRecord 和 XMPPFramework 中的代码做什么或不做什么。您将需要通过他们的正常支持方式与他们联系。

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

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

如果您使用 NSConfinementConcurrencyType 创建 MOC,那么您只能从创建 MOC 的线程访问 MOC。如果未指定并发,则默认使用限制。

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

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

于 2012-07-11T16:42:37.663 回答