首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OperationQueue.main对DispatchQueue.main

OperationQueue.main对DispatchQueue.main
EN

Stack Overflow用户
提问于 2016-11-23 12:07:05
回答 3查看 17.9K关注 0票数 36

当您需要在网络任务或操作的完成块中的主线程上执行某些操作时,这些方法中哪一种是最合适的,为什么?

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

回答 3

Stack Overflow用户

发布于 2016-11-23 12:26:03

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

这两种方法都会奏效。然而,当更高级的调度(包括依赖关系、取消等)时,大多数情况下都需要NSOperation。是必需的。所以在这种情况下,一个简单的

代码语言:javascript
运行
复制
DispatchQueue.main.async { /* do work */ }

一切都会好起来。那就相当于

代码语言:javascript
运行
复制
dispatch_async(dispatch_get_main_queue(), ^{ /* do work */ });

在目标C中,这也是我用那种语言所做的事情。

票数 17
EN

Stack Overflow用户

发布于 2016-11-23 12:31:20

何时使用NSOperation

NSOperation API很适合封装定义良好的功能块。例如,您可以使用NSOperation子类封装应用程序的登录序列。

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

如果您在短时间内创建了数十个操作,那么您可能会在操作中过度使用。由于NSOperation API固有的开销,这可能导致性能问题。

何时使用大中央调度

如果您只需要将代码块分派到串行或并发队列,那么Grand Central Dispatch是非常理想的。

如果您不想为一个琐碎的任务创建一个NSOperation subclass,那么Grand Central Dispatch是一个很好的选择。Grand Central Dispatch的另一个好处是可以将相关代码放在一起。看看下面的例子。

代码语言:javascript
运行
复制
let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
// Process Response
...

dispatch_async(dispatch_get_main_queue(), { () -> Void in
    // Update User Interface
    ...
})
})

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

本源逐字引用

票数 17
EN

Stack Overflow用户

发布于 2016-11-23 12:11:58

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

参考资料:苹果博士

NSOperationQueue类控制一组操作对象的执行。添加到队列后,操作将保留在该队列中,直到显式取消或完成其任务为止。队列中的操作(但尚未执行)本身是根据优先级级别和互操作对象依赖项组织的,并相应地执行。应用程序可以创建多个操作队列并将操作提交给其中的任何一个。

参考资料:苹果博士

因此,当您希望在任何网络调用的完成块上对主线程执行某些操作时,您应该更喜欢DispatchQueue.main.async。尤其是当它与UI Updates相关时!如果您的任务很复杂,我的意思是如果您需要对运行中的任务进行进一步的操作,那么您可以使用OperationQueue.main.addOperation,否则DispatchQueue.main.async会提供更好的性能。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40764140

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档