Ios 在多线程上下文中,在托管对象上设置属性时CoreData阻塞

Ios 在多线程上下文中,在托管对象上设置属性时CoreData阻塞,ios,multithreading,core-data,Ios,Multithreading,Core Data,我有一个关于核心数据的多线程问题 某些NSOperation使用以下说明在后台更新不同的NSManagedObject属性: BKArtistData *artistData = [self artistDataForName:bandName]; artistData.bandId = bandId; [self save]; artistDataForName在所有后台线程共享的上下文上执行提取。(我还尝试了每线程一个上下文的策略,但仍然存在阻塞) 我的问题是只有一个线程可以执行更新。其他

我有一个关于核心数据的多线程问题

某些NSOperation使用以下说明在后台更新不同的NSManagedObject属性:

BKArtistData *artistData = [self artistDataForName:bandName];
artistData.bandId = bandId;
[self save];
artistDataForName在所有后台线程共享的上下文上执行提取。(我还尝试了每线程一个上下文的策略,但仍然存在阻塞)

我的问题是只有一个线程可以执行更新。其他的线被卡在地板上了

artistData.bandId = bandId; 
线路


最终,我可以让更新从主线程执行。不过,知道阻塞是从哪里来的吗?

核心数据文档指出,NSManagedObject不是线程安全的。除非每个线程都有一个单独的ManagedObjectContext,否则您没有遵循指导原则,很可能会出现问题

您可以通过在主线程上执行更新来实现您想要的:

dispatch_async(dispatch_get_main_queue(), ^{
    artistData.bandId = bandId;
});
但是,仅将此更新推送到主线程可能不够,因为在您进行此更新之前,您传递给后台线程的NSManagedObject可能已在另一个线程中被删除或更改。。。因此,需要单独的ManagedObjectContext,然后使用核心数据工具来管理更新和处理冲突的更改


进一步:请仔细阅读你的问题。如果您在artistDataForName中执行提取,那么您肯定应该为每个线程使用单独的托管对象上下文。

我确实为每个线程尝试了相同的代码和不同的上下文,但仍然存在阻塞。从主线程进行更新效果很好,我的代码运行正常。不过,我很想知道为什么我的代码不起作用。。。我将更新我的问题,使其更具体。