OperationQueue.main vs DispatchQueue.main

App*_*Dev 23 ui-thread nsoperationqueue grand-central-dispatch ios swift

当你需要在网络任务或操作的完成块中的主线程上执行某些操作时,哪种方式获取它将是最合适的,为什么?:

  • OperationQueue.main.addOperation
  • DispatchQueue.main.async

MrM*_*age 13

有关两种类型队列之间差异的详细信息,请参阅Lion的答案.

这两种方法都有效.但是,NSOperation当需要更高级的调度(包括依赖性,取消等)时,通常需要它.所以在这种情况下,简单

DispatchQueue.main.async { /* do work */ }
Run Code Online (Sandbox Code Playgroud)

会没事的.这相当于

dispatch_async(dispatch_get_main_queue(), ^{ /* do work */ });
Run Code Online (Sandbox Code Playgroud)

在Objective-C中,我也是用这种语言做的.


Poo*_*ava 11

何时使用NSOperation

NSOperationAPI非常适合封装定义良好的功能块.例如,您可以使用NSOperation子类来封装应用程序的登录序列.

依赖管理是锦上添花.操作可以依赖于其他操作,这是Grand Central Dispatch缺乏的强大功能.如果您需要按特定顺序执行多个任务,那么操作是一个很好的解决方案.

如果您在短时间内创建了数十个操作,则可以过度操作.由于固有的开销,这可能导致性能问题NSOperation API.

何时使用Grand Central Dispatch

Grand Central Dispatch 如果您只需要将一段代码分派给串行或并发队列,这是理想的选择.

如果你不想经历创造一项NSOperation subclass琐碎任务的麻烦,那么这Grand Central Dispatch是一个很好的选择.另一个好处Grand Central Dispatch是您可以将相关代码保存在一起.看一下下面的例子.

let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
// Process Response
...

dispatch_async(dispatch_get_main_queue(), { () -> Void in
    // Update User Interface
    ...
})
})
Run Code Online (Sandbox Code Playgroud)

在数据任务的完成处理程序中,我们处理响应并通过将闭包(或块)分派给主队列来更新用户界面.这是必要的,因为我们不知道执行完成处理程序的哪个线程,并且它很可能是后台线程.

这个来源逐字引用

  • 为了清楚起见,GCD 使用了 DispatchQueue,NSOperationQueue 现在是 OperationQueue (2认同)

Lio*_*ion 10

DispatchQueue管理工作项的执行.提交到队列的每个工作项都在系统管理的线程池上处理.

参考:Apple Doc

NSOperationQueue类调节一组Operation对象的执行.添加到队列后,操作将保留在该队列中,直到明确取消或完成其任务为止.队列内的操作(​​但尚未执行)本身根据优先级和操作间对象依赖性进行组织,并相应地执行.应用程序可以创建多个操作队列并向其中任何一个提交操作.

参考:Apple Doc

因此,DispatchQueue.main.async当您想要从任何网络调用的完成块执行主线程时,您应该更喜欢.特别是当它与之相关时UI Updates!如果您的任务很复杂,我的意思是如果您需要进一步操作运行任务,那么您可以使用,OperationQueue.main.addOperation否则DispatchQueue.main.async将提供相对更优的性能!