【问题标题】:Which tasks are more suitable to NSOperation than GCD? [duplicate]哪些任务比 GCD 更适合 NSOperation? [复制]
【发布时间】:2011-05-19 16:41:56
【问题描述】:

在为 iPhone 编程时,哪些任务更适合使用 NSOperation 而不是使用 GCD

在我看来,他们似乎也在做同样的事情。我看不出一个人的优势和劣势。

【问题讨论】:

    标签: ios cocoa-touch nsoperation grand-central-dispatch


    【解决方案1】:

    我认为这里没有提到的一件事是NSOperations 可以在执行期间被取消,而一旦执行开始,一个块就可以保证完成。话虽如此,可以暂停一个 GCD 队列(dispatch_suspend()),这样当前正在执行的块之后的任何块都不会被执行。

    【讨论】:

      【解决方案2】:

      显然,从 iOS 4 开始,NSOperationQueue 是基于 GCD 构建的;文档还没有更新。在此处查看 Apple 员工的此帖子:https://devforums.apple.com/message/352770(您可能需要创建一个帐户)因此,您应该遵循 Mike Abdullah 的建议并使用最简单的 API 来完成手头的任务。 dispatch_async 是较低级别的,通常是 C 类型的东西(但不限于),并且适用于一次性和顺序类型的交易(在这个队列上触发这个块,FTW)。 NSOperationQueues 是更高级别的、Objective-C 的东西,如果您在代码中的各个点添加大量操作,和/或需要管理并发、优先级和依赖关系,那么它是很好的。至少我是这样使用它们的。

      【讨论】:

      • 我仍然不相信是这种情况。这个答案已经超过 2 年了,我仍然在 NSOperations 文档中看到这个:An operation queue executes its operations either directly, by running them on secondary threads, **or** indirectly using the libdispatch library (also known as Grand Central Dispatch).
      • @Answerbot 从 iOS 4 和 OS X 10.6 开始,情况不再如此。阅读“概述”部分的最后两部分developer.apple.com/library/ios/#documentation/Cocoa/Reference/…
      【解决方案3】:

      对于此类问题,请使用最简单的 API。衡量这是否是性能问题,然后在需要时重新评估。

      【讨论】:

      • 如果您告诉哪个 API 最简单,这个答案会很好。
      • 哪个最简单,取决于手头的任务
      • 基本上,如果您不考虑手头的任务,我想知道两者中最简单的 API。但是要提供一个标准用例 - 假设您有一个不希望在主线程上拥有的后台任务。完成后应该会改变视图。
      • 这听起来像是自己的问题。建议您从阅读文档开始。
      【解决方案4】:

      NSOperation 是建立在 GCD 之上的,所以问题更多的是你是使用 NSOperation 还是直接将块传递给 GCD。

      NSOperation 体积庞大,需要更多样板代码来设置它,但它具有更多功能。您可以在代码的各个部分创建相同的NSOperation 子类,并将它们放入队列并运行它。

      通过例如将块传递给 GCD dispatch_async 快速且一次性。您通常不会在其他任何地方重用块;您只需设置一个仅在该代码点执行的块,将其传递给 GCD 或其他 API,然后快速继续。

      所以各有千秋。

      【讨论】:

      • 公平地说,nsoperation 非常适合对时间要求不高的操作,例如下载文件,而 gcd 非常适合对时间要求严格的操作,例如对音频执行 dsp?你能给我举个例子,说明你什么时候会使用一个而不是另一个?
      • 我不这么认为。 NSOperation 肯定有更多的开销,但这并不能使 GCD 适合时间关键的操作。同样,NSOperation(在主队列中)是 GCD 上的一个薄层。所以你的问题没有意义。两者都是 GCD。
      • 也就是说,正如我上面写的,如果我在程序的各个部分创建并运行相同的后台任务,我将创建一个NSOperation。如果任务仅从程序的单个部分运行,我将只使用dispatch_async
      • 这被标记为 iOS 所以.... NSOperationQueue 还没有建立在 GCD 之上。请参阅:developer.apple.com/library/ios/#documentation/cocoa/reference/… 注意:在 iOS 中,操作队列不使用 Grand Central Dispatch 来执行操作。它们为非并发操作创建单独的线程,并从当前线程启动并发操作。有关并发和非并发操作之间的区别以及它们如何执行的讨论,请参阅 NSOperation 类参考。
      • 在 iOS4+ NSOperationQueue 上使用 GCD,请参阅类参考。
      猜你喜欢
      • 2010-12-04
      • 2015-11-15
      • 2015-06-03
      • 2013-12-11
      • 2010-11-28
      • 2012-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多