Swift 5.5 新引入的 async/await 并发模型,使用结构化并发(Structured Concurrency)模式,极大地改变了Swift并行代码开发的游戏规则。
了解 async/await 并发模型的小伙伴们都知道,Swift本质上是将并发任务转换为继承体系中的Task组来实现结构化并发的。
其中,关于Task和其子任务的一个特性是:当同一个Task中的任意子任务抛出异常或取消时,其它子任务都可以感知到这一行为:
If one of your child tasks throws an uncaught error, all remaining tasks will be implicitly cancelled.
子任务可以通过检查 Task.isCancelled 值或调用 Task.checkCancellation() 方法来完成感知。
不过,该特性触发需要一个隐藏条件,在本篇博文中我们就来详细讨论下如何让子任务取消可以被其它兄弟子任务所感知吧。
废话少叙,Let’s do it! 😉
首先,我们来看一下所有子任务都正常结束的情况,如下,我们分别创建了 task1() 和 task2() 两个子任务,它们都返回字符串类型: