问题描述
-
DispatchQueue schedule()、DispatchQueue async() 和 DispatchQueue concurrentPerform() 之间有什么区别?
-
在什么情况下分别使用更合适?
我找不到很多资源来说明这三者之间的区别。
我经历了这些: 链接:schedule、concurrentPerform、async、Raywenderlich、AppCoda、EonCodes 和其他一些。
解决方法
async
仅用于将任务异步分派到队列(队列可以尽快运行)。它用于将一些代码块分派到另一个队列。例如,可以从主线程调用它以将计算开销大的代码分派到某个后台队列,以避免阻塞主线程。或者,如果您已经在后台队列中,则可以使用它将必须在主线程上运行的代码分派回主队列(例如,UI 更新)。如果您想指定此分派任务应在何时运行(例如,在指定时间/延迟之后),您也可以使用 asyncAfter
。
schedule
是一种 API,其主要用途与 async
/asyncAfter
相同,但在 iOS 13 中与 Combine 一起引入。它只是分派代码块在指定的队列上运行,可以选择有一些延迟(或其他约束)。如果您需要支持 iOS 13 之前的旧 iOS 版本,请改用 async
/asyncAfter
。但是,如果您支持现代 iOS 版本(尤其是使用 Combine 时),那么您可以根据需要使用此 API。
concurrentPerform
服务于一个非常不同的功能需求,即如果您要重复分派代码块并与设备可以支持的尽可能多的工作线程并行。它通常用于编写计算密集型和大规模并行化的例程。它非常适合解决那些可能会出现“线程爆炸”的情况。 (在任何给定时刻可以使用的工作线程数量是非常有限的,如果超过这个数量,如果您不小心“爆炸”了您在任何时刻尝试使用的线程数量,您的应用程序可能会死锁。)因此,例如,如果您想并行运行数百或数千次迭代,concurrentPerform
会自动将并发度限制为您设备的功能(例如,如果您的设备中有 8 个内核,它只会运行一个在任何给定时间最多 8 个并发任务)。将此视为 for
循环,其中各种迭代彼此并行运行。但是除非您正在编写大规模并行化的代码,否则您可能永远不需要使用它。但是当你在的时候,它是非常有用的。