使用NSMainQueueConcurrencyType时,是否有必要在performBlock中执行Core Data读取?

rol*_*and 12 concurrency core-data ios

根据Daniel Eggert在这个问题中的回答,当使用托管对象上下文时NSPrivateQueueConcurrencyType,必须做任何触及它的内容或属于它的对象performBlock:或者performBlockAndWait:

是真的NSMainQueueConcurrencyType吗?想象一下在主线程上运行的以下代码,例如在UIViewController中:

self.moc = [[[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType] autorelease];
//moc setup

__block RHWidget *widget = nil;

[self.moc performBlockAndWait:^{
    widget = [(RHWidget *)[self.moc objectWithID:self.widgetObjectID] retain];
}];

self.labelView.text = widget.descriptionString;

[widget release];
Run Code Online (Sandbox Code Playgroud)

在块之外使用小部件是否安全,因为我们知道我们在主线程上?或者有必要这样做:

__block NSString *description = nil;

[self.moc performBlockAndWait:^{
    RHWidget *widget = (RHWidget *)[self.moc objectWithID:self.widgetObjectID];
    description = [widget.descriptionString copy];
}];

self.labelView.text = description;

[description release];
Run Code Online (Sandbox Code Playgroud)

如果有另一个NSManagedObjectContext,可能是私有队列类型,在块中工作并将更改推送到self.moc作为一个parentContext

这当然是一个稍微有点人为的例子,但是将这个小部件安全地传递给例如需要访问某些小部件属性的模态视图控制器会很不错.我是否应该传递窗口小部件的objectID并performBlock:在新的视图控制器中重新获取它?

ric*_*ter 7

更新:根据WWDC 2011 Session 303(iOS上的核心数据有什么新功能),NSMainQueueConcurrencyType旨在允许主线程上的正常消息传递; 您只需-performBlock:在与来自不同线程的上下文交互时使用.(我在下面的原始答案仍然相关部分.)


我已经制作了一个或两个修改Xcode默认"Master-Detail"应用模板的应用程序来制作"主要"MOC(由应用委托创建并在视图控制器之间传递)仅限主要队列,父级为私有 - 我用于后台操作的队列上下文,例如从Web提取中导入数据.因此,上下文及其对象的大多数使用都是在没有被包含的情况下发生的performBlock:.(我唯一使用的performBlock:是将更改从后台任务上下文推回到主要更新UI.)工作正常.