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