根据Daniel Eggert在this question中的回答,当使用带有NSPrivateQueueConcurrencyType
的托管对象上下文时,必须在{{>>内触及它的任何或属于它的对象{ {1}}或performBlock:
performBlockAndWait:
是否也是如此?想象一下在主线程上运行的以下代码,例如在UIViewController中:
NSMainQueueConcurrencyType
在块之外使用窗口小部件是否安全,因为我们知道我们在主线程上?或者有必要这样做:
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];
如果那里有另一个__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];
,可能是私有队列类型,在块中工作并将更改推送到self.moc作为NSManagedObjectContext
,事情是否会发生变化?
这当然是一个稍微有点人为的例子,但是将这个小部件安全地传递给例如需要访问某些小部件属性的模态视图控制器会很不错。我是否应该传递窗口小部件的objectID并在新视图控制器中的parentContext
内重新获取它?
答案 0 :(得分:7)
更新:根据WWDC 2011 Session 303 (What's New in Core Data on iOS),NSMainQueueConcurrencyType
旨在允许主线程上的正常消息传递;在与来自不同线程的上下文进行交互时,您只需要使用-performBlock:
。 (我原来的答案仍然是相关的部分。)
我制作了一个或两个修改Xcode默认“Master-Detail”应用模板的应用程序来制作“主要”MOC(由app委托创建并在视图控制器之间传递)仅限主要队列,以及父级到我用于后台操作的私有队列上下文,例如从Web提取中导入数据。因此,上下文及其对象的大多数使用都不会被performBlock:
包裹。 (我唯一一次使用performBlock:
是将更改从后台任务上下文推回到主要更新UI。)工作正常。