【发布时间】:2018-06-29 12:12:32
【问题描述】:
文档声明带有 NSPrivateQueueConcurrencyType 的 NSManagedObjectContext 允许用户通过使用 performBlock: 来执行异步代码。但是,如果我想编写一个 NSOperation 子类来处理此类子上下文/私有队列设置中的托管对象,会发生什么?
例如:
// Get managed object IDs from selected objects (defined in one of my own categories).
NSArray * selectedObjIDs = [NSManagedObjectContext IDsWithObjects:self.arrayController.selectedObjects];
NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^
{
NSManagedObjectContext * childContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
childContext.parentContext = myMainMOC;
[childContext performBlock:^
{
// Get objects in child context with previously generated managed object IDs (again, from my own category).
NSArray * privateObjects = [childContext objectsWithIDs:selectedObjIDs];
// Do something with the objects.
for( NSManagedObject * object in privateObjects )
{
[object setValue:@"New Title" forKey:@"title"];
}
[childContext save:NULL];
}];
}];
// Execute in our own private NSOperationQueue.
[self.backgroundQueue addOperation:operation];
代码运行良好,但在两个块内设置断点时,我可以看到执行首先进入后台线程 A(由 NSBlockOperation 生成),然后进入后台线程 B(专用于子 MOC - 正如预期的那样。
(顺便说一句:我相信我在 Apple 的 WWDC 会话“高级 NSOperations”的示例代码中看到了等效设置。)
问题 #1:这两个嵌套调度是否存在某种问题,即在性能方面?这对我来说似乎不对 - 代码不应该只在子 MOC 的私有队列中运行吗?
问题 #2:假设我将 NSOperation 子类化(而不是使用 NSBlockOperation)。我是否应该重写它的“异步”属性以向真的返回 YES,只使用子 MOC 的私有队列?
【问题讨论】:
-
不确定我是否关注。如果您看到代码在后台线程“B”上运行,那么私有队列有什么问题? “B”在某种程度上是错误的吗?
-
是的,这是我的问题 #1(可能不清楚):主要威胁上的代码生成线程 A 然后生成线程 B 是否存在问题?这就是我所说的“嵌套调度”的意思。
标签: ios multithreading macos core-data concurrency