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

Posted

技术标签:

【中文标题】NSFetchRequest 如何知道哪个托管对象上下文在范围内?【英文标题】:How does NSFetchRequest know which managed object context is in scope? 【发布时间】:2018-01-19 13:57:58 【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

你的Core Data Stack是什么样子的,你或许可以在那里获得。 【参考方案1】:

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

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

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

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

但这有很多“可能”和“也许”,您通过文档化的 API 找不到任何东西。

【讨论】:

以上是关于NSFetchRequest 如何知道哪个托管对象上下文在范围内?的主要内容,如果未能解决你的问题,请参考以下文章

你如何构造 NSFetchRequest setHavingPredicate: 的谓词?

如何获取与其他不使用 id 字段相关的托管对象?

如何检查托管对象存储在哪个持久存储中?

NSFetchRequest 挂起

托管对象上下文和数据获取顺序

对实现比较的对象的 NSFetchRequest 的结果进行排序: