哪一个更容易使用?GCD还是NSOperation?

Ano*_*ite 5 objective-c nsoperation grand-central-dispatch xcode4.5

我目前正在使用GCD.但是,我听说这NSOperation实际上是一个更高级别的计划.但它要复杂得多.

在GCD中,在后台做一些事情就是使用我创建的辅助函数:

+(void)doForeGround:(void (^)())block
{
    dispatch_async(dispatch_get_main_queue(), ^{
        block();
    });
}

+(void)doBackground:(void (^)())block
{

    //DISPATCH_QUEUE_PRIORITY_HIGH
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW,0), ^{
    //dispatch_async(dispatch_get_global_queue(-2,0), ^{
        block();
    });
}

-(void)doBackGround:(void (^)())block onComletion:(void (^)())onCompletion
{
    [BGHPTools doBackground:^{
        block();
        [BGHPTools doForeGround:^{
            onCompletion();
        }];
    }];
}
Run Code Online (Sandbox Code Playgroud)

这样做NSOperation会更简单吗?

我错过了什么吗?我如何在NSoperation做同样的事情?

BJ *_*mer 6

您可以NSOperation使用GCD 进行类似的操作.主要区别在于NSOperation提供了额外的功能.

例如:

  • NSOperation有一个-cancel方法.派遣队列没有取消的概念; 队列中排队的所有块都将运行完成.
  • NSOperationQueue有一个maximumConcurrentOperationCount属性,您可以使用(例如)一次只允许3个操作运行.派遣队列没有这样的概念; 它们是串行的,一次只允许1个块,或者并发,允许libdispatch根据CPU使用和可用性认为可行的数量.
  • 一个NSOperation可以具有与其他依赖NSOperationS,让您推迟特定操作的执行,直到所有的依赖已经运行.在依赖操作等待时,将允许其他操作在队列中"跳转".调度队列始终以严格的FIFO顺序出列.(您可以使用dispatch_groupAPI 模仿依赖关系,但这确实是针对不同类型的问题.)

现在,如果你没有使用任何这些功能,GCD工作得很好.使用GCD本身并没有.只是NSOperation为一些额外的好功能提供了方便的包装.

以下是您使用NSOperationQueue以下内容重写上述示例的方法:

+(void)doForeground:(void (^)())block
{
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog(@"I'm running on the main thread!");
        block();
    }];
}

+(void)doBackground:(void (^)())block
{
    // Note; rather than allocating a new NSOperationQueue every time, you could
    // allocate the queue once and just refer to that queue. For simplicity, I'll
    // skip that here.
    [[NSOperationQueue new] addOperationWithBlock:^{
        NSLog(@"I'm running asynchronously on whatever thread NSOperationQueue wants!");
        block();
    }];
}

-(void)doBackground:(void (^)())block onCompletion:(void (^)())onCompletion
{
    [[NSOperationQueue new] addOperationWithBlock:^{
        block();
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            onCompletion();
        }];
    }];
}
Run Code Online (Sandbox Code Playgroud)