在Xcode7中,打开-com.apple.CoreData.ConcurrencyDebug开关后,即使只读取属性,也会发生多线程冲突。这是预期的行为吗?
-(NSManagedObjectContext *)newPrivateManagedObjectContext
{
NSManagedObjectContext *newContext =
[[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType>];
[newContext setParentContext:<some shared MOC with NSMainQueueConcurrencyType];
return newContext;
}
-(void)someMethod
{
NSManagedObjectContext *context = [self newPrivateContext];
NSManagedObject *mo = [context objectWithID:objectID]; // concurrency voilation
// assuming the above worked you would still get
if (mo.someProperty == nil) // also a concurrency violation
{
}
}目前,Xcode似乎期望我们在一个NSManagedObjectContext块中编写与performBlock*的每一个交互。也许我漏掉了什么?
发布于 2015-11-05 21:36:25
这是意料之中的。您使用的是NSPrivateQueueConcurrencyType,这意味着您的必须在每次执行使用上下文的操作时都使用performBlock:或performBlockAndWait: 。这包括对上下文的任何方法调用(例如,对objectWithID:的调用)。它还包括对上下文管理的任何其他对象的任何调用--例如查找从上下文获取的对象上的属性值。
简而言之:这正是应该发生的事情,因为您没有正确地使用托管对象上下文。
https://stackoverflow.com/questions/33555147
复制相似问题