如何避免在Core Data中使用唯一键重复插入?

时间:2013-05-02 03:19:00

标签: ios core-data

我知道Core Data将NSManagedObjectId作为其主键。

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

Thread A尝试将带有msgId 1001的消息插入上下文中。在插入之前,thread A已尝试查找包含密钥msgId和值1001的邮件。没有找到任何内容,因此它执行插入操作。

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

所以,作为时间------------->

Thread A:find - >插入 - >保存

Thread B:find - >插入 - >保存

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

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

感谢。

1 个答案:

答案 0 :(得分:0)

杰森李,

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

安德鲁