【问题标题】:What is the difference between DispatchQueue schedule() vs DispatchQueue async() vs DispatchQueue concurrentPerform() for iOS ApplicationiOS 应用程序的 DispatchQueue schedule() vs DispatchQueue async() vs DispatchQueue concurrentPerform() 有什么区别
【发布时间】:2021-04-28 22:03:20
【问题描述】:
  1. DispatchQueue schedule()、DispatchQueue async() 和 DispatchQueue concurrentPerform() 有什么区别?

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

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

我经历了这些: 链接:scheduleconcurrentPerformasyncRaywenderlichAppCodaEonCodes 和其他一些链接。

【问题讨论】:

  • FWIW,Eon.Codes link 很好,但有一些不准确之处。首先,“有时在内部循环上执行 concurrentPerform 比在外部循环上更高效”是倒退的。在外循环上执行它几乎总是更高效。其次,使用concurrentPerform 来控制异步请求的数量只是一种不好的做法,它将 CPU 问题与受限的网络并发性混为一谈。但除此之外,这是对concurrentPerform 的一个不错的介绍。

标签: ios swift cocoa-touch concurrency grand-central-dispatch


【解决方案1】:

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

schedule 是一个 API,其主要用途与 async/asyncAfter 相同,但在 iOS 13 中与 Combine 一起引入。它只是调度代码块以在指定队列上运行,可选有一些延迟(或其他限制)。如果您需要支持 iOS 13 之前的旧 iOS 版本,请改用async/asyncAfter。但如果您支持现代 iOS 版本(尤其是在使用 Combine 的情况下),那么您可以根据需要使用此 API。

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

【讨论】:

    猜你喜欢
    • 2019-03-07
    • 2019-09-22
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多