将 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 方法只启动网络调用,然后在后台运行,并在完成后回调操作。然后更改 isFinished
的 NSOperation
属性以标记工作现已完成。
所以.... 通常,当您向 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/