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 如何知道哪个托管对象上下文在范围内?的主要内容,如果未能解决你的问题,请参考以下文章