1.Async/await
- 异步闭包的缺点:要保证方法中的每个分支都要执行闭包
- swift能保证有返回值的函数,如果没有返回某个值,就会抛出异常(这个工作可以由swift来做)
- 但是异步闭包却无法保证在每个分支中都执行闭包
- async/await可以解决这个问题
1 | // 异步闭包 |
2.Async sequences
- async sequences和普通的sequence的区别是,他取出元素时是异步的。
1 | for await id in staticImageIDsURL.lines { |
3.Async/await原理
3.1 普通的函数调用
3.2 async函数调用
- await会将线程挂起,把函数的运行交给系统来控制(而不是线程),由系统决定什么时候执行;
- 执行完成之后,系统会调用resume将结果返回给函数。
- async函数中可以多次挂起,也可以一次都不挂起
await意味着该函数不是在一个事务里进行的,在await之后线程可能会做很多其他事情,甚至切换到另外一个线程。(详细信息可以观看“protect mutable state with swift actors”)
4.异步方法的测试
4.1使用XCTestExpectation
1 | class MockViewModelSpec: XCTestCase { |
4.2使用Async/await
1 | class MockViewModelSpec: XCTestCase { |
5.sync转async
- 移除completion闭包
- 函数签名后面加上async
- 闭包调用处加上await或者try await
- 用async{ } 将await包起来
1 | struct ThumbnailView: View { |
6.Async alternatives 和 continuation
- Async alternatives: 函数有可能返回两种不同类型的值
- continuation:手动控制函数返回
1 | // Existing function |
- 有些情况需要不同的代理方法返回的数据,此时需要把continuation存储起来,每次使用时赋值,使用完成清除
1 | class ViewController: UIViewController { |