NSOperation vs GCD用于更新视图

时间:2015-03-30 14:05:59

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

使用它时是否有任何区别(这是用于测试目的的代码):

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];
             }];
             */
        }
    }];

2 个答案:

答案 0 :(得分:0)

这两者实际上是一样的。

答案 1 :(得分:0)

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

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

  

在GCD之前,我在我的网站中使用了很多NSOperations / NSOperationQueues   管理并发的应用程序。但是,自从我开始使用   GCD定期,我几乎完全取代了NSOperations和   NSOperationQueues包含块和调度队列。这来自于   我是如何在实践和分析中使用这两种技术的   我已经对他们进行了表演。

     

首先,使用时会产生大量的开销   NSOperations和NSOperationQueues。 这些是Cocoa对象,它们   需要分配和解除分配。在我的iOS应用程序中   写道,它以60 FPS呈现三维场景,我正在使用NSOperations   封装每个渲染帧。当我描述这个,创作   并且这些 NSOperations的拆解占了很大比例   部分CPU在正在运行的应用程序中循环,并且正在放缓   事情发生了。我用简单的块和GCD序列替换了它们   队列,开销消失,导致明显更好   渲染性能。这不是我注意到的唯一地方   使用NSOperations的开销,我在Mac和Mac上看到了这一点   的iOS。

     

其次,基于块的调度代码很难实现   在使用NSOperations时匹配。它非常方便   在一个块中包含几行代码并将其分派给它   串行或并发队列,其中创建自定义NSOperation或   NSInvocationOperation要做到这一点需要更多的支持代码。   我知道你可以使用NSBlockOperation,但你也可以   然后向GCD发送内容。以内联块的形式包装此代码   在您的应用程序中进行相关处理导致我认为   比单独的方法或自定义更好的代码组织   NSOperations封装了这些任务。

     

NSOperations和NSOperationQueues仍然有很好的用途。 GCD有   没有真正的依赖概念,NSOperationQueues可以设置   非常复杂的依赖图。我使用NSOperationQueues   少数案件。

     

总的来说,虽然我通常主张使用最高级别的   完成任务的抽象,这是我争论的一个案例   对于GCD的低级API。在iOS和Mac开发人员中我都有   谈到这一点,绝大多数选择使用GCD   NSOperations除非他们的目标是OS版本而不支持   它(那些在iOS 4.0和Snow Leopard之前)。