gpt4 book ai didi

objective-c - 添加一个 NSOperationQueue 到一个 NSOperation

转载 作者:搜寻专家 更新时间:2023-10-30 20:02:55 25 4
gpt4 key购买 nike

将一个 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 操作的复杂性增加。在 NSOperation 中嵌入一个 NSOperationQueue 意味着操作变成了 Concurrent

所以这是我的"is"。


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

NSOperationQueue 在正常(非并发)NSOperation 上调用start 方法,并期望操作在开始 调用返回。例如,您提供给 NSBlockOperation 的一些代码在 block 的末尾完成。

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

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

所以...通常当您将操作添加到 NSOperationQueue 时,该队列会在后台运行这些操作。因此,如果您将 NSOperationQueue 放入 NSOperation 中,那么操作工作将在后台完成。因此,该操作是并发,您需要在内部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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com