2015-11-05 62 views
0

看起来像在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每一个互动。也许我错过了什么?

回答

2

这是预期的。您正在使用NSPrivateQueueConcurrencyType,这意味着您需要必须使用performBlock:performBlockAndWait:当您做一些使用上下文时。这包括上下文中的任何方法调用(例如,您致电objectWithID:)。它还包含对由上下文管理的任何其他对象的任何调用,例如查找从上下文中获取的对象上的属性值。

简而言之:这正是应该发生的情况,因为您没有正确使用托管对象上下文。

+0

汤姆 - 感谢您的快速响应。我几年前就读过,只有在分配属性时才需要块。我仍然可以在脑海中看到文章的各个部分......只是不记得它是哪一个。我要去坐在课堂后面一段时间。 : -/ – memmons

+0

@memmons - 不能相信你读过的所有东西......即使在SO上;-)但是,你可以相信汤姆所说的话。 –

+0

@JodyHagins事实上,我知道汤姆的资格。这种情况让我想起了几个月前,当我得知花生酱事实上并不是绿色的时候(对于像我这样的红/绿色盲的人来说显然是一个常见的错误)。我会在“我所假设的事情是真的,但绝对不是。 – memmons