当您需要在网络任务或操作的完成块中的主线程上执行某些操作时,这些方法中哪一种是最合适的,为什么?
OperationQueue.main.addOperation
DispatchQueue.main.async
发布于 2016-11-23 12:26:03
有关这两种类型队列之间差异的详细信息,请参阅Lion的答案。
这两种方法都会奏效。然而,当更高级的调度(包括依赖关系、取消等)时,大多数情况下都需要NSOperation
。是必需的。所以在这种情况下,一个简单的
DispatchQueue.main.async { /* do work */ }
一切都会好起来。那就相当于
dispatch_async(dispatch_get_main_queue(), ^{ /* do work */ });
在目标C中,这也是我用那种语言所做的事情。
发布于 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
的另一个好处是可以将相关代码放在一起。看看下面的例子。
let dataTask = session.dataTaskWithRequest(request, completionHandler: { (data, response, error) -> Void in
// Process Response
...
dispatch_async(dispatch_get_main_queue(), { () -> Void in
// Update User Interface
...
})
})
在数据任务的完成处理程序中,我们通过向主队列分配一个闭包(或块)来处理响应和更新用户界面。这是必要的,因为我们不知道完成处理程序是在哪个线程上执行的,而且它很可能是后台线程。
本源逐字引用
发布于 2016-11-23 12:11:58
DispatchQueue管理工作项的执行。提交给队列的每个工作项都在系统管理的线程池上处理。
参考资料:苹果博士
NSOperationQueue类控制一组操作对象的执行。添加到队列后,操作将保留在该队列中,直到显式取消或完成其任务为止。队列中的操作(但尚未执行)本身是根据优先级级别和互操作对象依赖项组织的,并相应地执行。应用程序可以创建多个操作队列并将操作提交给其中的任何一个。
参考资料:苹果博士
因此,当您希望在任何网络调用的完成块上对主线程执行某些操作时,您应该更喜欢DispatchQueue.main.async
。尤其是当它与UI Updates
相关时!如果您的任务很复杂,我的意思是如果您需要对运行中的任务进行进一步的操作,那么您可以使用OperationQueue.main.addOperation
,否则DispatchQueue.main.async
会提供更好的性能。
https://stackoverflow.com/questions/40764140
复制相似问题