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

Objective c 核心数据:在不同线程中更改两个对象时互斥/死锁?,objective-c,core-data,mutex,deadlock,Objective C,Core Data,Mutex,Deadlock,我有两个核心数据对象:一个组织和一个人,它们链接在一起 如果我在不同的线程中更改它们并同时保存它们,是否有问题?因此线程是并行运行的: 线程1: -使用NSManagedObjectID加载组织 -对对象进行更改 -保存对象 线程2: -使用NSManagedObjectID加载Person -对对象进行更改 -保存对象 对我来说,似乎我得到了一个互斥,因为这;不是每一次,但有时会发生。如果这就是问题所在-解决方案是什么?:) 非常感谢 Stefan是,如果使用相同的NSManagedObjec

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

如果我在不同的线程中更改它们并同时保存它们,是否有问题?因此线程是并行运行的:

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

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

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

非常感谢


Stefan

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

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

核心数据的设计方式很少需要一个以上的
NSManagedObjectContext
。一个这样的上下文应该总是在给定的时间在一个线程上运行

编辑


如果这是不可能的,因为您依赖于Web服务等,请考虑使用<代码> NSn通报S,并只在主线程上进行保存。(使用

performSelectorOnMainThread

我有单独的NSManagedObjectContext,只有一个PersistentStore。所以我认为它应该会起作用,不是吗?你是如何合并结果的?是否设置了通知?是的,已设置通知。更改与“[mainContext performSelectorOnMainThread:mergeChanges withObject:notification waitUntilDone:YES]”合并;对象创建或修改有问题吗?当在单独的线程上创建对象时,不能保证已经创建了对象对。您使用的是NSO操作还是直线程?不幸的是,这并不是那么容易。后台正在运行异步web调用—有时我会得到一个组织:存储它。有时我会得到一个客户商店。请看我在答案中添加的内容。但是如何将NSManagedObject添加到主线程?如果我在后台填充对象,我不能将其传递给另一个线程,可以吗?您不能将NSManagedObject传递给主线程,它已经在那里了。您只需要(从web线程)向主线程获取有关此新对象的信息(例如,通过通知)。