根据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:在新的视图控制器中重新获取它?