NSFetchRequest如何知道哪个托管对象上下文在范围内?

时间:2018-01-19 13:57:58

标签: ios macos core-data

execute()上调用NSFetchRequest时,如果获取请求不知道NSManagedObjectContext,则会收到错误消息。提供该上下文的一种方法是在传递给execute的块中调用managedObjectContext.perform()

以某种方式,获取请求能够确定上下文是什么。我假设它必须在某处查看线程局部变量。我想将这个机制用于我自己的邪恶目的,但对于我的生活,我无法弄清楚这个上下文的存储位置。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

它没有记录,依赖私有API。

创建托管对象上下文时,请指定.mainQueueConcurrencyType.privateQueueConcurrencyType。这告诉上下文要使用哪种队列,主队列或私有调度队列。

当您execute()获取请求时,它使用" ...与当前队列关联的托管对象上下文执行。"这是创建上下文的队列,主要或私有。

它如何知道哪个队列?它没有记录,依赖于一些不暴露给Apple以外的开发人员的内部手段。很可能它会向DispatchQueue询问当前队列(未记录),然后通过特定于队列的数据查找上下文。您可以通过在调试代码时查看当前队列来发现一些相关信息(没有API可以获得它,但调试器知道)。从那里,您可以使用DispatchQueue方法找到上下文,可能是getSpecific<T>(key: DispatchSpecificKey<T>)

但那很多&#34;可能&#34;和&#34;也许&#34;并且您通过文档化的API找不到任何内容。