ios - iOS 应用程序的 DispatchQueue schedule() vs DispatchQueue async() vs DispatchQueue concurrentPerform() 有什么区别
问题描述
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
循环,其中各种迭代彼此并行运行。但除非您正在编写大规模并行化代码,否则您可能永远不需要使用它。但是,当您使用时,它非常有用。
推荐阅读
- excel - 在excel vba中将字符串转换为二进制
- python - pythonanywhere // python manage.py collectstatic = 0 静态文件复制到 // 175 未修改
- php - laravel excel导出xlsx下载不起作用
- sql - 使用外键表示 SQL 表中的二叉树
- firebase - Flutter Cloud Firestore orderBy 和限制问题
- azure - 无法在 NativeScript 中创建新的 Blob 容器
- java - Java 服务器未通过套接字接收 C++ 客户端
- javascript - 对象和点符号
- python - 尝试运行 SummitKwan 的 transparent_latent_gen 以在 Google Colab 中生成人脸
- php - 如何在拨号会话与 Twilio 异步接收忙信号后留下 mp3 语音邮件?