似乎在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*
编写每个单独的互动。也许我错过了什么?
答案 0 :(得分:2)
这是预料之中的。您正在使用NSPrivateQueueConcurrencyType
,这意味着您必须使用performBlock:
或performBlockAndWait:
每次时间上下文。这包括对上下文的任何方法调用(例如,您对objectWithID:
的调用)。它还包括对上下文管理的任何其他对象的任何调用 - 例如查找从上下文获取的对象的属性值。
简而言之:这正是应该发生的事情,因为您没有正确使用托管对象上下文。