【问题标题】:NSOperation vs GCD for updating view [duplicate]用于更新视图的 NSOperation vs GCD [重复]
【发布时间】:2015-06-03 14:14:20
【问题描述】:

使用这个有什么区别吗(这里的代码仅供测试):

dispatch_async(dispatch_get_main_queue(), ^{
                [self.progressBar setProgress:progressValue];
});

而不是这个:

[[NSOperationQueue mainQueue] addOperationWithBlock:^
{
    [self.progressBar setProgress:progressValue];
}];

我在这种情况下使用上面的代码:

NSOperationQueue *progressQueue = [[NSOperationQueue alloc] init];


    [progressQueue addOperationWithBlock:^{
        for (int i = 1; i <= 10; i++) {
            sleep(1);
            float progressValue = (float)i/10.0;

            /* GCD
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.progressBar setProgress:progressValue];
            });
            */
            /* Does this have the same effect as using GCD from above
            [[NSOperationQueue mainQueue] addOperationWithBlock:^
             {
                  [self.progressBar setProgress:progressValue];
             }];
             */
        }
    }];

【问题讨论】:

  • 在你的情况下,我会使用 GCD。 NSOperation 有一些特性:它们可以被取消并具有依赖关系。 GCD 可用于处理文件和内存块。您需要根据您正在尝试解决的任务做出决定。
  • @Cy-4AH 感谢您的回复,我会记住这一点。是的,我有点意识到 NSOperation 在使用线程时提供了更高级别的抽象,并且它具有很好的小功能(GCD 没有),比如从队列中取消操作。但是,我感兴趣的是这两个示例是否完成了完全相同的任务?
  • NSOperation 是一个可可对象,而不是 GCD 不是。仅当您无法使用 GCD 做您想做的事情时才使用 NSOperation
  • @thedjnivek 谢谢,我明白你和 Cy-4AH 所指出的。另外我没有考虑可能的开销,而是这两种技术的影响(更新进度条)......这只是为了学习目的,以更好地理解 NSOperation......我会按照建议坚持 GCD因为我认为我可以做任何事情(我正在尝试在 SpriteKit 中实现自定义进度条)。
  • 实际上这不是那个问题的重复,因为我的问题是基于我的特定示例,而不是 GCD 与 NSOperation 的一般... ;)

标签: ios objective-c grand-central-dispatch nsoperation


【解决方案1】:

同样的事情,但不是真的......!

正如@BradLarson 在这里所说 NSOperation vs Grand Central Dispatch

在 GCD 之前,我在我的内部使用了很多 NSOperations / NSOperationQueues 用于管理并发的应用程序。但是,自从我开始使用 GCD 定期,我几乎完全取代了 NSOperations 和 带有块和调度队列的 NSOperationQueues。这来自 我是如何在实践中使用这两种技术的,以及从分析中 我在他们身上表演过。

首先,使用时会产生不小的开销 NSOperations 和 NSOperationQueues。 这些是 Cocoa 对象,它们 需要分配和释放。在我的 iOS 应用程序中 写了以 60 FPS 渲染 3-D 场景,我使用 NSOperations 来 封装每个渲染的帧。当我对此进行分析时,创作 和这些 NSOperations 的拆卸是一个重要的原因 正在运行的应用程序中的部分 CPU 周期,并且正在减慢 事情下来了。我用简单的块和 GCD 串行替换了这些 队列,并且开销消失了,导致明显更好 渲染性能。这不是我注意到的唯一地方 使用 NSOperations 的开销,我在 Mac 和 iOS。

其次,基于块的调度代码有一种优雅,但很难 在使用 NSOperations 时匹配。非常方便 将几行代码包装在一个块中并调度它以执行 串行或并发队列,其中创建自定义 NSOperation 或 NSInvocationOperation 要做到这一点需要更多的支持代码。 我知道你可以使用 NSBlockOperation,但你也可以 然后向 GCD 发送一些东西。将此代码内嵌在块中 在我看来,您的申请中的相关处理会导致 比使用单独的方法或自定义更好的代码组织 NSOperations 封装了这些任务。

NSOperations 和 NSOperationQueues 仍然有很好的用途。 GCD有 没有真正的依赖概念,NSOperationQueues 可以在其中设置 相当复杂的依赖图。我为此使用 NSOperationQueues 几个案例。

总的来说,虽然我通常主张使用最高级别的 完成任务的抽象,这是我争论的一个案例 用于 GCD 的底层 API。在我接触过的 iOS 和 Mac 开发者中 谈到这个,绝大多数选择使用GCD over NSOperations 除非它们的目标操作系统版本不支持 它(iOS 4.0 和 Snow Leopard 之前的那些)。

【讨论】:

  • 这是误导。 NSOperations 可能涉及更多开销,但这不是分配和释放。 GCD 块(提交到队列)也是堆分配的对象,因此就内存管理而言,分配和释放的负担是相同的。如果您更喜欢使用 NSOp,请随时继续这样做,直到您像这个人一样分析您的应用并发现这是一个问题。
【解决方案2】:

这两者实际上是相同的。

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    相关资源
    最近更新 更多