【发布时间】:2013-05-02 03:18:59
【问题描述】:
我知道 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 不是数据库,而是对象图。
谢谢。
【问题讨论】: