核心数据:并发和串行队列

问题描述 投票:0回答:1

我已经使用 Core Data 一段时间了,总是专门学习有关多线程的新知识。我目前正在重写我的一个应用程序的数据模型,并有几个问题。

核心数据模型使用具有约束集的实体(通常在字段 id 上)。 主上下文和后台上下文使用 NSMergeByPropertyObjectTrumpMergePolicy,因此不存在合并冲突。

将数据添加到容器有多种方式。

用户可以手动添加数据。可以通过从 CloudKit 获取数据来添加数据。数据可以通过在应用程序启动时运行的不同帮助程序类添加(从 JSON 导入新数据、从 JSON 更新现有数据等)。因此,可能可以从多个线程对持久容器进行读写访问。

之前我使用操作队列来进行串行访问。

我的问题是:将所有调用包装到

context.perform { }
中就足够了吗? Core Data 是否串行运行这些?如果我并行使用来自不同类和线程的三个
context.perform
调用(一些在主上下文上,一些在后台上下文上)会发生什么?我是否仍然需要自己在操作队列上运行这些以确保它们依次运行?我想确保核心数据不会发生并发崩溃,并确保始终保持数据完整。

multithreading core-data queue
1个回答
0
投票

context.perform { }
的调用是串行的 仅适用于该上下文。您可以在上下文中根据需要多次调用它,并且调用将按顺序运行。如果您使用多个上下文,则无法保证一个上下文的代码与其他上下文相比将如何运行。由于托管对象上下文不是线程安全的,因此 不应该成为问题,如果是,那么您还有其他潜伏的问题需要修复。

如果由于某种原因您需要序列化使用多个上下文的调用,并且您发现合并策略不足以解决差异,那么您需要弄清楚如何保持它们有序。

© www.soinside.com 2019 - 2024. All rights reserved.