Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用唯一实体Id从两个不同线程并发保存到核心数据持久存储_Multithreading_Core Data_Persistence_Nsmanagedobjectcontext - Fatal编程技术网

Multithreading 使用唯一实体Id从两个不同线程并发保存到核心数据持久存储

Multithreading 使用唯一实体Id从两个不同线程并发保存到核心数据持久存储,multithreading,core-data,persistence,nsmanagedobjectcontext,Multithreading,Core Data,Persistence,Nsmanagedobjectcontext,我正在实现多线程核心数据下载程序 在实体中保存具有唯一字符串属性的对象时,我遇到了将对象加倍的问题 如果两个线程同时从同一个url下载(例如,更新程序计时器启动,应用程序进入前台-因此用户调用更新方法),我无法检查持久存储中是否存在具有唯一属性值的对象,因此对象会加倍 如何避免将对象加倍?性能方面的最佳解决方案是什么 描述:(对不起,我还不能发布图片) 我以前遇到过这个问题,这是一个棘手的问题 我通过在单独的后台线程中执行下载来解决这个问题(与您现在所做的相同),但所有代码数据写入操作都发生在全

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

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

如果两个线程同时从同一个url下载(例如,更新程序计时器启动,应用程序进入前台-因此用户调用更新方法),我无法检查持久存储中是否存在具有唯一属性值的对象,因此对象会加倍

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

描述:(对不起,我还不能发布图片)
我以前遇到过这个问题,这是一个棘手的问题

我通过在单独的后台线程中执行下载来解决这个问题(与您现在所做的相同),但所有代码数据写入操作都发生在全局NSOperation队列上,numConcurrentOperations设置为1。每次后台下载完成后,它都会创建一个NSO操作并将其放入该队列

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


坏:由于核心数据操作是串行工作,而不是并行工作,因此性能受到轻微影响。这可以通过在下载后台线程中对数据进行所需的任何计算,并在核心数据操作中尽可能少地进行计算来缓解。

另一种方法是在
NSOperation
中执行下载/保存,然后再将操作添加到队列中,您可以检查
NSOperationQueue
中是否存在下载该URL的现有操作


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

paulbailey,deanWombourne,谢谢。通过检查NSMutableDictionary中objectForKey:的存在性,我以这种方式完成了任务,其中键是[url absoluteString]。Deanwomberne numConcurrentOperations=1不支持的原因是,我的CoreDataUpdateManager.h包含一些导入程序(xml、json等)的抽象工厂,并管理队列中的操作,以便在多个线程中下载不同实体的数据。这不是一个很好的解决方案,但很有效)