在MainContext和PrivateContext上使用-com.apple.CoreData.ConcurrencyDebug 1异步块崩溃

Las*_*sti 5 concurrency core-data objective-c ios

我已经为我的目标添加了-com.apple.CoreData.ConcurrencyDebug 1标志.问题是我有一个正在运行的后台块,当我使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType时崩溃

我的代码:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 NSManagedObjectContext *privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
 [privateManagedObjectContext setParentContext:_mainContext];
 [User fetchUserWithContext:_ privateManagedObjectContext];
}];
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 [User fetchUserWithContext:_mainContext];
}];
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我得到:

CoreData` + [NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor ]:

谢谢你的帮助,

Tom*_*ton 7

这不是Core Data队列并发的工作原理.使用NSPrivateQueueConcurrencyType或时NSMainQueueConcurrencyType,您需要在访问上下文时使用performBlockperformBlockAndWait方法NSManagedObjectContext.你在这里使用GCD的事实是无关紧要的; 如果你正在使用队列并发,你必须使用这些方法,否则你做错了.

您需要将fetchUserWithContext调用放在传递给其中一个方法的块中.您还需要放置任何其他访问从传递给其中一个方法的块内的上下文中获取的对象的内容.