我知道 Core Data 将 NSManagedObjectId 作为其主键。
现在,在这样的场景中,msgId 对于消息记录是唯一的。
Thread A
尝试将 msgId 为 1001 的消息插入到上下文中。在插入之前,thread A
已经尝试找到带有键msgId
和值的消息1001
的消息。没有找到任何东西,所以它执行插入操作。
同时,Thread B
对带有 msgId 的消息做同样的事情1001
。
所以,随着时间------------->
Thread A
: 查找 --> 插入 --> 保存
Thread B
: 查找 --> 插入 --> 保存
线程 A 和线程 B 都有自己的上下文,它们查找、插入和保存,所以带有 msgId 的消息1001
可能被插入两次并重复保存到磁盘。
也许我可以使用串行队列DISPATCH_QUEUE_SERIAL
来制作find-insert-save
一一进行操作以避免这个问题。但是我想知道是否还有其他方法可以做到这一点,例如主键?是的,我知道 Core Data 不是数据库,而是对象图。
谢谢。