1

我知道 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 不是数据库,而是对象图。

谢谢。

4

1 回答 1

0

杰森·李

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

安德鲁

于 2013-05-02T15:37:25.200 回答