Core Data 多上下文唯一性

Posted

技术标签:

【中文标题】Core Data 多上下文唯一性【英文标题】:Core Data multiple context uniqueness 【发布时间】:2014-06-14 07:38:55 【问题描述】:

我正在使用下图中显示的核心数据堆栈。我想设计一个可以在两个工作上下文中创建对象的结构。

我在设置中观察到的是,如果两个上下文几乎同时尝试创建相同的对象(对于唯一键),db 最终会为表创建两行。有没有办法解决这个问题?提前感谢您的回复。

【问题讨论】:

【参考方案1】:

确保唯一性的唯一方法是拥有一个协调对象,所有上下文都可以用来验证它们的操作(如果您愿意,可以使用“唯一性强制执行器”)。

一般算法描述为HERE,但是您属于“多线程/上下文”类别,这会使事情复杂化。

在多线程环境中,您的实施者必须先保存到存储区(使用其自己的托管对象上下文),然后再将结果返回给调用对象。

一般流程是(无缓存版本):

    来自强制执行者的密钥上下文请求对象 执行器发出“处于锁定状态”的请求(锁定实际锁或使用串行调度队列)
      enforcer 查询存储中的现有对象 为丢失的键创建对象并保存它们
        您可能希望将对象标记为存根,因为调用者最终可能不会保存,并且它会给您一个标志,以便在您的视图中的获取请求中忽略它们
      用他创建的对象构建结果数组
        结果可能是 NSManagedObjectIDs 或在调用者上下文中导入的对象,否则您将面临跨上下文访问托管对象的风险

【讨论】:

以上是关于Core Data 多上下文唯一性的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 使用多个上下文中的新对象从后台线程订购一对多关系保存

Core Data 托管对象上下文线程同步

EF Core / Sqlite 一对多关系在唯一索引约束上失败

如何正确使用 Core Data 进行多线程处理? [关闭]

如果您想通过 Core Data 使用多个实体,您需要为每个实体提供一个托管对象上下文吗?

Core data multithreading fetch record