我正在实现多线程核心数据下载器。
在实体中保存具有唯一字符串属性的对象时,我遇到了加倍对象的问题。
如果2个线程同时从同一个url下载(fe,updater-timer触发并且应用程序进入前台 - 所以用户调用update方法),我无法在持久存储中检查具有唯一属性值的对象的存在,因此对象加倍
如何避免加倍对象以及在性能方面最佳解决方案是什么?
描述:(抱歉,我无法发布图片) http://i.stack.imgur.com/yMBgQ.png
答案 0 :(得分:0)
我之前遇到过这个问题,这是一个棘手的问题。
我通过在单独的后台线程中执行下载来解决它(与您现在一样)但是所有代码数据写入操作都发生在全局NSOperation队列上,其中numConcurrentOperations设置为1.当每个后台下载完成时,它创建了一个NSOperation并把它放到那个队列上。
好:非常简单的线程安全 - NSOperationQueue确保只有一个线程在任何一点都写入CoreData。
糟糕:性能略有下降,因为核心数据操作是串联工作,而不是并行工作。这可以通过对下载后台线程中的数据进行所需的任何计算来减轻,并在Core Data操作中尽可能少地进行。
答案 1 :(得分:0)
另一种方法是在NSOperation
内执行下载/保存,在向队列添加操作之前,您可以检查是否有现有操作在{{{ 1}}。
这种方法的优点是您不会下载任何超出必要的数据。