NSOperationQueue 添加到 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];

最佳答案

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

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

我广泛阅读了 NSOperation,但没有看到任何警告反对这种方法的评论。我在网上查阅了大量信息、Apple 文档和 WWDC 视频。

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

所以这是我的'是'。

有关并发操作的其他详细信息:
NSOperationQueue 在正常(非并发)start 上调用 NSOperation 方法,并期望在 start 调用返回时完成操作。例如,您提供给 NSBlockOperation 的一些代码在块的末尾是完整的。

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

例如,并发操作常用于运行异步网络调用; start 方法只启动网络调用,然后在后台运行,并在完成后回调操作。然后更改 isFinishedNSOperation 属性以标记工作现已完成。

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

或者,NSOperationQueue 上有一些方法,例如 waitUntilAllOperationsAreFinished,可用于确保在 start 调用返回之前完成所有工作,但是这些涉及阻塞线程,我避免了它们,您可能对这种方法感到更舒服,并确保您没有任何阻塞线程的副作用。

就我而言,我已经熟悉 Concurrent 操作,因此将其设置为 Concurrent 操作很简单。

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

Concurrency Programming Guide: Configuring Operations for Concurrent Execution

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

关于objective-c - 将 NSOperationQueue 添加到 NSOperation,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16748670/

10-12 07:05