我有两个核心数据对象:一个组织和一个链接在一起的人。
如果我在不同的线程中更改它们并保存它们,这是一个问题吗?所以线程并行运行:
主题1: - 使用NSManagedObjectID加载组织 - 对对象进行更改 - 保存对象
主题2: - 使用NSManagedObjectID加载Person - 对对象进行更改 - 保存对象
对我而言,似乎因为这个而得到了一个互斥量;不是每一次,但有时它会发生。如果那就是问题 - 解决方案是什么? :)
非常感谢!
的Stefan
答案 0 :(得分:2)
是的,如果您使用相同的NSManagedObjectContext,则会出现问题。 Core-Data,不是完全线程安全的,NSManagedObjectID是。在后台线程上,您必须使用相同的存储创建一个单独的上下文然后保存,它会在保存时通知主线程以合并两个上下文。您可以通过创建合并策略来控制此合并。所以你仍然可以做到但不像希望的那样容易。
答案 1 :(得分:0)
不要让线程并行运行。 CoreData非常高效。只需在同一个线程中按顺序执行数据操作并保存一次。
核心数据的设计方式非常少,因此必须拥有多个NSManagedObjectContext
。一个这样的上下文应该总是在给定时间在一个线程上运行。
修改强>
如果因为您依赖Web服务等而无法做到这一点,请考虑使用NSNotification
并仅在主线程上进行保存。 (使用performSelectorOnMainThread
)。