3

将 an 添加NSOperationQueue到 an NSOperation,然后将此操作添加到另一个是否安全NSOperationQueue

这是一些代码来可视化我正在尝试做的事情。

NSOperationQueue *mainQueue = [NSOperationQueue alloc] init];

// Here I declare some NSBlockOperation's, i.e. parseOperation1-2-3
// and also another operation called zipOperation, which includes
// an NSOperationQueue itself. This queue takes the processed (parsed) files
// and write them to a single zip file. Each operation's job is to write the data
// stream and add it to the zip file. After all operations are done,
// it closes the zip.

[zipOperation addDependency:parseOperation1];
[zipOperation addDependency:parseOperation2];
[zipOperation addDependency:parseOperation3];

[mainQueue addOperation:parseOperation1];
[mainQueue addOperation:parseOperation2];
[mainQueue addOperation:parseOperation3];
[mainQueue addOperation:zipOperation];
4

1 回答 1

5

我已经使用了这种方法,并让它在 App Store 上部署的实时代码中运行。在开发过程中或代码上线后的过去 2 个月内,我没有遇到任何问题。

就我而言,我有一系列高级操作,其中一些包含一组子操作。我没有将每个子操作的细节暴露在高级代码中,而是创建了NSOperations它们自己包含NSOperationQueues并将自己的子操作排队。我最终得到的代码更干净,更易于维护。

我广泛阅读NSOperation并没有看到任何警告这种方法的评论。我查看了很多在线信息、Apple 文档和 WWDC 视频。

唯一可能的“缺点”可能是增加了理解和实现Concurrent操作的复杂性。在 an 中嵌入 anNSOperationQueue意味着NSOperation操作变为Concurrent.

所以这是我的“是”。


有关并发操作的其他详细信息:

An在正常(非并发)上NSOperationQueue调用该方法,并期望该操作在调用返回时完成。例如,您提供的某些代码在块的末尾是完整的。startNSOperationstartNSBlockOperation

start如果在调用返回时工作还没有完成,那么你将 配置NSOperation为一个Concurrent操作,所以它NSOperationQueue知道它必须等到你告诉它操作在稍后的某个时间点完成。

例如,并发操作通常用于运行异步网络调用;start 方法仅启动网络调用,然后在后台运行,并在完成后回调操作。然后,您将 的isFinished属性更改NSOperation为标记工作现已完成。

所以.... 通常,当您NSOperationQueue向该队列添加操作时,会在后台运行这些操作。所以如果你把一个NSOperationQueue放在里面,NSOperation那么操作工作将在后台完成。因此,操作是concurrent,您需要在内部NSOperationQueue完成处理所有操作时进行标记。

或者,有一些方法NSOperationQueue可以waitUntilAllOperationsAreFinished用来确保在start调用返回之前完成所有工作,但是这些涉及阻塞线程,我避免了它们,你可能会觉得这种方法更舒服,并确保你不阻塞线程有任何副作用。

就我而言,我已经熟悉Concurrent操作,因此只需将其设置为Concurrent操作即可。

关于并发操作的一些文档:

并发编程指南:为并发执行配置操作

在这个例子中,他们正在分离一个线程以在后台执行工作,在我们的例子中,我们将从NSOperationQueue这里开始。

于 2013-05-26T09:40:47.587 回答