Xcode7读取属性时发生ConcurrencyDebug并发冲突?
问题描述:
看起来像在Xcode7中打开-com.apple.CoreData.ConcurrencyDebug
开关,即使您只是读取属性,也会发生多线程违规。这是预期的行为吗?Xcode7读取属性时发生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是希望我们写在performBlock*
块与NSManagedObjectContext
每一个互动。也许我错过了什么?
答
这是预期的。您正在使用NSPrivateQueueConcurrencyType
,这意味着您需要必须使用performBlock:
或performBlockAndWait:
每当您做一些使用上下文时。这包括上下文中的任何方法调用(例如,您致电objectWithID:
)。它还包含对由上下文管理的任何其他对象的任何调用,例如查找从上下文中获取的对象上的属性值。
简而言之:这正是应该发生的情况,因为您没有正确使用托管对象上下文。
汤姆 - 感谢您的快速响应。我几年前就读过,只有在分配属性时才需要块。我仍然可以在脑海中看到文章的各个部分......只是不记得它是哪一个。我要去坐在课堂后面一段时间。 : -/ – memmons
@memmons - 不能相信你读过的所有东西......即使在SO上;-)但是,你可以相信汤姆所说的话。 –
@JodyHagins事实上,我知道汤姆的资格。这种情况让我想起了几个月前,当我得知花生酱事实上并不是绿色的时候(对于像我这样的红/绿色盲的人来说显然是一个常见的错误)。我会在“我所假设的事情是真的,但绝对不是。 – memmons