Swift concurrency

Sellen Wei
Jul 12, 2021

--

这次wwdc2021, Apple介绍了一个新的概念:aync/await in swift,这会不会改变我们原有的aync task编程习惯,我们一起来学习一下

Meet async/await in Swift

如上图的小图,假设他们都需要从网上下载,那么从生成request到渲染完成图片显示,这中间的步骤有可能会非常慢,completion handler会将任务分发到不同的thread上面去执行,保证某个thread不会被block。

但是completion handler prune to bugs,这种编码模式很容易忘掉call completion handler,这就表示,任务可能会被不小心卡住,如果你忘记了swift不会告诉你有地方错了,而且completion会被过度使用,code重复率很高。

Improvement

  1. 使用enum
  2. Async/Await

这是一个改写的例子,在可能需要等待的地方加上try await和throw, await加在async function的前面,看起来他是被加在了background thread上面,system可以决定是否执行或者终止这个task,比如这时如果有更重要的UI Action,那么系统可以决定是否先执行UI

Await call完成的时候,await之后的部分会resume

Test

那么来看看如何改变现有的test,原来的completion handler unit test 如下:

改写成这个tests

我的问题:

这个我觉得其实也有点问题,一个是,如果我们忘记写try await,或者await会出现什么问题呢?这个其实也是需要dev去记住什么地方要加这些signature,而且跟completion handler不同的是,如果一旦忘记了,可能thread会被搞得很混乱的,那么这样随意加signature的意义在哪里呢?这个等我们以后来解答。

--

--