异步编程:从 Combine 调度器到 async/await
1. 执行异步工作
在主线程上执行计算密集型工作并非明智之举。就像之前的示例所展示的,在主线程运行这类代码可能会导致 UI 卡顿,甚至完全阻塞 UI。对于异步 API(如网络请求、Firebase 等云服务,甚至是异步处理事件的本地 API),我们应将此类代码卸载到后台线程。具体做法是在后台调度器上订阅相应的发布者(或操作符)。当后台进程完成且发布者发出事件时,再切换回主线程更新 UI。
一般的使用模式如下:
publisher
.subscribe(on: DispatchQueue.global())
.receive(on: DispatchQueue.main)
.sink { }
我们可以使用 DispatchQueue.global(qos:) 的重载版本来指定后台代码的服务质量,不同的服务质量及其适用场景如下:
| 服务质量 | 描述 | 适用场景 |
| ---- | ---- | ---- |
| background | 后台任务优先级最低,用于应用在后台运行时执行的工作 | 应用在后台时的一些不紧急任务 |
| utility | 优先级低于默认、用户发起和用户交互任务,但高于后台任务 | 不影响用户继续使用应用的长时间运行任务,如用户不主动关注进度的任务 |
| default | 优先级低于用户发起和用户交互任务,但高于实用工具和后台任务 | 应用发起或代表用户执行的主动工作 |
| userI
超级会员免费看
订阅专栏 解锁全文
849

被折叠的 条评论
为什么被折叠?



