这两种向主线程(CGD 和 NSOperationQueue)分派工作的方式是否等价?

Whether those two ways of dispatching work to main thread (CGD and NSOperationQueue) are equivalent?

我很好奇这两种将工作分派到主队列的类型是否等同或者可能存在一些差异?

 dispatch_async(dispatch_get_main_queue()) {
        // Do stuff...
    }

NSOperationQueue.mainQueue().addOperationWithBlock { [weak self] () -> Void in
       // Do stuff..
    }

在最基本的层面上,它们不是一回事。

是的,操作队列方法将在 GCD 队列上调度。但它也获得了使用操作队列的所有丰富好处,例如添加依赖操作的简便方法;状态观察;取消操作的能力……

所以不,它们不等价。

是的,GCD 和 NSOperation 是有区别的。
GCD 是轻量级的,可以用来提供多线程的味道,比如加载个人资料图片、加载网页、网络调用,这肯定 returns 最早。

NSOperation 队列
1。通常用于进行繁重的网络调用,对数千条记录进行排序等
2。可以在任何操作中添加新操作、删除、获取当前状态
3。添加完成处理程序
4。 get operation count etc

比 GCD

更有优势

有差异,但有些微妙。

排队到 -[NSOperationQueue mainQueue] 的操作在 运行 循环中每次执行一个操作。这意味着,除其他事项外,操作之间将有一个 "draw" 传递。

使用 dispatch_async(dispatch_get_main_queue(),...)-[performSelectorOnMainThread:...] 所有排队的 blocks/selectors 一个接一个地调用而不旋转 运行 循环(即允许视图绘制或类似的东西) . 运行循环将在执行完所有排队块后继续。

因此,关于绘图,dispatch_async(dispatch_get_main_queue(),...)-[performSelectorOnMainThread:...] 将批处理操作合并到一次绘制过程中,而 -[NSOperationQueue mainQueue] 将在每次操作后绘制。

要对此进行全面、深入的调查,请参阅我的回答 over here