WWDC21-认识Swift中的async/await
2021-06-14 本文已影响0人
行知路
一、实例对比
假如我们需要从网络下载一个图片,并且把图片转换为缩略图;这两个操作都是耗时的操作,所以在下面的代码中使用了异步下载数据与异步创建缩略图的能力。
如果你已经习惯于写这样的代码,或者从来么有想过这样的代码是否有问题。那么,你会认为这些代码没什么问题,就应该这样的,其实这段代码的可读性太差、对于一个这么简单的任务所需的代码量也是巨大的。
针对返回值,我们可以使用Swift提供的Result类型来进行一些优化,消除第一个函数中潜在的逻辑表达瑕疵(如果不理解的话可以看看Swift为什么引入Result类型)。
稍微优化后的方法
是时候展示一下最新的代码的样子了!请仔细看一下下面的代码!虽然有些代码你可能看不懂,但是这段代码与上面的代码相比,是不是简单很多很多很多!
async/await代码
函数声明中的async标明这个函数时可以异步执行的——也就是说执行这段代码是可以不阻塞当前线程。然后再try await语句中,异步等待从网路请求数据完成。在最后一个await中,可以异步等待通过图片获取缩略图。
请仔细阅读以上代码!也许你觉得这只是Swift引入了一些新的关键字、实现了一些新的能力,也不代表什么!其实这种代码的背后是有巨大的差异!非async/await代码,就像以前没有引入结构化程序设计时的代码一样,充满了goto(在这里指完成回调),这严重影响了代码的阅读,降低了人效!引入了async/let之后,把异步编码结构化了,使我们可以按照自然的思维习惯去实现功能、编写代码。进步是巨大的!
二、async/await分析
除了上面代码所展示的——函数/方法可以是异步的,属性也可以是异步的。
异步属性
在函数、属性和初始值设定项中,await 可用于表达式可以解除当前线程阻塞;除此之外,await还可以用于异步序列。
异步序列
关于async/let的说明。
异步的特性
- 当您将函数标记为异步时,您就允许它挂起。当一个函数挂起自己时,它也会挂起它的调用者。所以它的调用者也必须是异步的。
- 为了指出异步函数中它可能挂起一次或多次的位置,使用了 await 关键字。
- 当异步函数被挂起时,线程不会被阻塞。
- 当异步函数恢复时,从它调用的异步函数返回的结果流回原始函数,并从上次停止的地方继续执行。
三、async/await应用相关
3.1 基于SwiftUI的应用
基于SwiftUI的应用3.2 既有的完成处理程序&Delegate
苹果对现存的以完成回调、代理返回的方法都进行了处理,以支持此种新特性。