从两个不同的线程并发地保存到具有唯一实体Id的Core Data持久存储

时间:2011-12-15 13:08:02

标签: multithreading core-data persistence nsmanagedobjectcontext

我正在实现多线程核心数据下载器。

在实体中保存具有唯一字符串属性的对象时,我遇到了加倍对象的问题。

如果2个线程同时从同一个url下载(fe,updater-timer触发并且应用程序进入前台 - 所以用户调用update方法),我无法在持久存储中检查具有唯一属性值的对象的存在,因此对象加倍

如何避免加倍对象以及在性能方面最佳解决方案是什么?

描述:(抱歉,我无法发布图片) http://i.stack.imgur.com/yMBgQ.png

2 个答案:

答案 0 :(得分:0)

我之前遇到过这个问题,这是一个棘手的问题。

我通过在单独的后台线程中执行下载来解决它(与您现在一样)但是所有代码数据写入操作都发生在全局NSOperation队列上,其中numConcurrentOperations设置为1.当每个后台下载完成时,它创建了一个NSOperation并把它放到那个队列上。

好:非常简单的线程安全 - NSOperationQueue确保只有一个线程在任何一点都写入CoreData。

糟糕:性能略有下降,因为核心数据操作是串联工作,而不是并行工作。这可以通过对下载后台线程中的数据进行所需的任何计算来减轻,并在Core Data操作中尽可能少地进行。

答案 1 :(得分:0)

另一种方法是在NSOperation内执行下载/保存,在向队列添加操作之前,您可以检查是否有现有操作在{{{ 1}}。

这种方法的优点是您不会下载任何超出必要的数据。