我知道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不是数据库,而是对象图。
感谢。
答案 0 :(得分:0)
我通过在后台队列上执行所有插入并捕获-didSave通知来开始在UI中显示项目来解决此问题。这可以保证在创建项目时对项目进行单一访问。之后,对于已知的唯一ID,始终允许多线程访问。
安德鲁