Ios 如何避免核心数据中具有唯一密钥的重复插入?

Ios 如何避免核心数据中具有唯一密钥的重复插入?,ios,core-data,Ios,Core Data,我知道核心数据将NSManagedObjectId作为其主键 现在,在这样的场景中,msgId对于消息记录来说是唯一的 线程A尝试在上下文中插入带有msgId 1001的消息。在插入之前,线程A尝试使用键msgId和值1001查找消息。找不到任何内容,因此它执行插入操作 同时,线程B正在使用msgId1001对消息执行相同的操作 因此,随着时间的推移----------------> 线程A:查找-->插入-->保存 线程B:查找-->插入-->保存 线程A和线程B都有自己的上下文,它们查找、插

我知道核心数据将NSManagedObjectId作为其主键

现在,在这样的场景中,msgId对于消息记录来说是唯一的

线程A
尝试在上下文中插入带有msgId 1001的消息。在插入之前,
线程A
尝试使用键
msgId
和值
1001
查找消息。找不到任何内容,因此它执行插入操作

同时,
线程B
正在使用msgId
1001对消息执行相同的操作

因此,随着时间的推移---------------->

线程A
:查找-->插入-->保存

线程B
:查找-->插入-->保存

线程A和线程B都有自己的上下文,它们查找、插入和保存,因此带有msgId
1001
的消息可能被插入两次并重复保存到磁盘

也许我可以使用串行队列
DISPATCH\u queue\u serial
逐个执行
find insert save
操作来避免此问题。但我想知道是否还有其他方法可以做到这一点,比如主键?是的,我知道核心数据不是数据库,而是对象图

谢谢。

Jason Lee

我通过在后台队列上执行所有插入操作并捕获-didSave通知以开始在UI中呈现项目来解决此问题。这保证了在创建项目时可以对其进行单一访问。此后,始终允许针对已知唯一ID进行多线程访问

安德鲁