核心数据:在不同线程中更改两个对象时的互斥/死锁?

时间:2011-11-14 20:40:58

标签: objective-c core-data mutex deadlock

我有两个核心数据对象:一个组织和一个链接在一起的人。

如果我在不同的线程中更改它们并保存它们,这是一个问题吗?所以线程并行运行:

主题1: - 使用NSManagedObjectID加载组织 - 对对象进行更改 - 保存对象

主题2: - 使用NSManagedObjectID加载Person - 对对象进行更改 - 保存对象

对我而言,似乎因为这个而得到了一个互斥量;不是每一次,但有时它会发生。如果那就是问题 - 解决方案是什么? :)

非常感谢!

的Stefan

2 个答案:

答案 0 :(得分:2)

是的,如果您使用相同的NSManagedObjectContext,则会出现问题。 Core-Data,不是完全线程安全的,NSManagedObjectID是。在后台线程上,您必须使用相同的存储创建一个单独的上下文然后保存,它会在保存时通知主线程以合并两个上下文。您可以通过创建合并策略来控制此合并。所以你仍然可以做到但不像希望的那样容易。

答案 1 :(得分:0)

不要让线程并行运行。 CoreData非常高效。只需在同一个线程中按顺序执行数据操作并保存一次。

核心数据的设计方式非常少,因此必须拥有多个NSManagedObjectContext。一个这样的上下文应该总是在给定时间在一个线程上运行。

修改

如果因为您依赖Web服务等而无法做到这一点,请考虑使用NSNotification并仅在主线程上进行保存。 (使用performSelectorOnMainThread)。