根据Daniel Eggert在this question中的回答,当将托管对象上下文与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];

因为我们知道我们在主线程上,所以在块外使用小部件安全吗?或者有必要执行以下操作:
__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(可能是私有(private)队列类型),以块为单位进行工作并将更改作为parentContext推送到self.moc,情况是否会发生变化?

当然,这是一个人为设计的示例,但是最好将该小部件安全地传递给需要访问小部件某些属性的模态视图 Controller ,例如模态视图 Controller 。我应该改为传递小部件的objectID并在新的 View Controller 中的performBlock:中重新获取它吗?

最佳答案

更新:根据WWDC 2011 Session 303 (What's New in Core Data on iOS)NSMainQueueConcurrencyType旨在允许在主线程上进行常规消息传递。您仅需要在与其他线程的上下文进行交互时使用-performBlock:。 (下面是我原始答案的相关部分。)

我制作了一个或两个应用程序,它们修改了Xcode的默认“Master-Detail”应用程序模板,以使“主要” MOC(由应用程序委托(delegate)创建并在 View Controller 之间传递)仅作为主队列,而父级则为私有(private)队列。我用于后台操作(例如从Web提取导入数据)的队列上下文。因此,上下文及其对象的大多数使用都是在不包装在performBlock:中的情况下发生的。 (我唯一使用oj​​it_code的方法是将更改从后台任务上下文推回到主要对象,以更新UI。)工作正常。

关于ios - 使用NSMainQueueConcurrencyType时是否有必要在performBlock中读取Core Data?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9996888/

10-12 04:36