【发布时间】:2012-04-17 07:42:17
【问题描述】:
根据 Daniel Eggert 在 this question 中的回答,当使用带有 NSPrivateQueueConcurrencyType 的托管对象上下文时,有必要在 performBlock: 或 @ 中执行任何接触它或属于它的对象的任何事情 987654325@
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];
既然我们知道我们在主线程上,那么在块外使用小部件是否安全?或者有必要这样做:
__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];
如果有另一个NSManagedObjectContext,可能是私有队列类型,分块工作并将更改作为parentContext推送到self.moc,事情会改变吗?
当然,这是一个稍微做作的示例,但最好安全地将小部件传递给需要访问小部件某些属性的模态视图控制器。我是否应该传递小部件的 objectID 并在新视图控制器的 performBlock: 中重新获取它?
【问题讨论】:
-
有一篇非常全面的文章here 描述了包括上下文并发类型和嵌套上下文在内的各种方法。
标签: ios core-data concurrency