首页 > 解决方案 > iOS 应用程序的 DispatchQueue schedule() vs DispatchQueue async() vs DispatchQueue concurrentPerform() 有什么区别

问题描述

  1. DispatchQueue schedule()、DispatchQueue async() 和 DispatchQueue concurrentPerform() 有什么区别?

  2. 在什么情况下分别使用更合适?

我找不到太多说明这三者之间区别的资源。

我浏览了这些: 链接:scheduleconcurrentPerformasyncRaywenderlichAppCodaEonCodes等等。

标签: iosswiftcocoa-touchconcurrencygrand-central-dispatch

解决方案


async仅用于将任务异步分派到队列(队列可以运行它)。它用于将一些代码块分派到另一个队列。例如,可以从主线程调用它,以便将计算量大的代码分派到某个后台队列,以避免阻塞主线程。或者,如果您已经在后台队列中,您可以使用它将必须在主线程上运行的代码分派回主队列(例如,UI 更新)。asyncAfter如果你想指定这个分派的任务应该在什么时候运行(例如,在指定的时间/延迟之后),你也可以使用。

schedule是一个 API,其用途与async/大致相同asyncAfter,但在 iOS 13 中与Combine一起引入。它只是调度代码块以在指定的队列上运行,可选地具有一些延迟(或其他约束)。如果您需要支持 iOS 13 之前的旧 iOS 版本,只需使用async/asyncAfter代替。但是,如果您支持现代 iOS 版本(特别是如果您使用的是 Combine),那么您可以根据需要使用此 API。

concurrentPerform满足了非常不同的功能需求,即如果您要重复调度代码块并与设备可以支持的尽可能多的工作线程并行。它通常在编写计算密集型和大规模并行化的例程时使用。它非常适合解决那些您可能会遇到“线程爆炸”的情况。(在任何给定时刻可以使用的工作线程数量非常有限,如果超过这个数量,如果您不小心“爆炸”了您在任何时候尝试使用的线程数量,您的应用程序可能会死锁。)例如,如果您想并行运行数百或数千次迭代,concurrentPerform自动限制设备功能的并发程度(例如,如果您的设备中有 8 个内核,则它在任何给定时间最多只能运行 8 个并发任务)。将此视为一个for循环,其中各种迭代彼此并行运行。但除非您正在编写大规模并行化代码,否则您可能永远不需要使用它。但是,当您使用时,它非常有用。


推荐阅读