2013-05-02 64 views
1

我知道核心数据使NSManagedObjectId作为其主键。如何避免核心数据中具有唯一键的重复插入?

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

Thread A尝试将带有msgId 1001的消息插入到上下文中。在插入之前,thread A已尝试使用密钥msgId和值1001查找消息。没有发现任何东西,所以它执行插入操作。

与此同时,Thread B对msgId为1001的消息也做同样的事情。

因此,随着时间------------->

Thread A:发现 - >插入 - >保存

Thread B:发现 - >插入 - - > save

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

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

谢谢。

回答

0

贾森·李,

我通过执行所有的刀片在后台队列和追赶的-didSave通知开始浮现在UI项目解决这个问题。这保证了在创建项目时对其进行单一访问。之后,对于已知的唯一ID,多线程访问始终是允许的。

Andrew