Multithreading 使用唯一实体Id从两个不同线程并发保存到核心数据持久存储
我正在实现多线程核心数据下载程序 在实体中保存具有唯一字符串属性的对象时,我遇到了将对象加倍的问题 如果两个线程同时从同一个url下载(例如,更新程序计时器启动,应用程序进入前台-因此用户调用更新方法),我无法检查持久存储中是否存在具有唯一属性值的对象,因此对象会加倍 如何避免将对象加倍?性能方面的最佳解决方案是什么 描述:(对不起,我还不能发布图片)Multithreading 使用唯一实体Id从两个不同线程并发保存到核心数据持久存储,multithreading,core-data,persistence,nsmanagedobjectcontext,Multithreading,Core Data,Persistence,Nsmanagedobjectcontext,我正在实现多线程核心数据下载程序 在实体中保存具有唯一字符串属性的对象时,我遇到了将对象加倍的问题 如果两个线程同时从同一个url下载(例如,更新程序计时器启动,应用程序进入前台-因此用户调用更新方法),我无法检查持久存储中是否存在具有唯一属性值的对象,因此对象会加倍 如何避免将对象加倍?性能方面的最佳解决方案是什么 描述:(对不起,我还不能发布图片) 我以前遇到过这个问题,这是一个棘手的问题 我通过在单独的后台线程中执行下载来解决这个问题(与您现在所做的相同),但所有代码数据写入操作都发生在全
我以前遇到过这个问题,这是一个棘手的问题 我通过在单独的后台线程中执行下载来解决这个问题(与您现在所做的相同),但所有代码数据写入操作都发生在全局NSOperation队列上,numConcurrentOperations设置为1。每次后台下载完成后,它都会创建一个NSO操作并将其放入该队列 好:非常简单的线程安全性-NSOperationQueue确保在任何一点上只有一个线程写入CoreData
坏:由于核心数据操作是串行工作,而不是并行工作,因此性能受到轻微影响。这可以通过在下载后台线程中对数据进行所需的任何计算,并在核心数据操作中尽可能少地进行计算来缓解。另一种方法是在
NSOperation
中执行下载/保存,然后再将操作添加到队列中,您可以检查NSOperationQueue
中是否存在下载该URL的现有操作
这种方法的优点是,您不需要下载任何超出需要的数据。paulbailey,deanWombourne,谢谢。通过检查NSMutableDictionary中objectForKey:的存在性,我以这种方式完成了任务,其中键是[url absoluteString]。Deanwomberne numConcurrentOperations=1不支持的原因是,我的CoreDataUpdateManager.h包含一些导入程序(xml、json等)的抽象工厂,并管理队列中的操作,以便在多个线程中下载不同实体的数据。这不是一个很好的解决方案,但很有效)