读取属性时Xcode7 ConcurrencyDebug并发冲突?

时间:2015-11-05 21:30:02

标签: ios core-data concurrency

似乎在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*编写每个单独的互动。也许我错过了什么?

1 个答案:

答案 0 :(得分:2)

这是预料之中的。您正在使用NSPrivateQueueConcurrencyType,这意味着您必须使用performBlock:performBlockAndWait: 每次时间上下文。这包括对上下文的任何方法调用(例如,您对objectWithID:的调用)。它还包括对上下文管理的任何其他对象的任何调用 - 例如查找从上下文获取的对象的属性值。

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