一、引言
在Swift5.5引入了受结构化编程思维影响的结构化并发的并发编程方式。
以下是一个使用传统的回调通知来实现的异步编程实例
传统的异步编程
在此种编程模式下,具有以下一些劣势:
- 不能使用错误处理
- 不能使用for循环来处理所有的图片
- 不容易理解等
以下是使用新的结构化并发编程的方式来还原原来的功能。
结构化异常处理
注意
关于此基于结构化并发的新的实现方式中设计到的async、await等关键字,如果读者不理解的话,建议参与本作者其他的WWDC21文章。
可以看出此函数与上面的实现方式相比具有较大的进步
- 可以抛出错误
- 具有返回值
- 没有使用递归
- 代码更容易理解
虽然基于结构化并发的代码比传统的代码要好很多,但是,还开更好!目前的代码中下载缩略图是串行进行的——下载一个图片、生成一个缩略图,这无法充分利用多核设备的能力。可以使用Swift5.5中的Task(任务)来进一步增强代码的能力。 - 任务提供了一个并发执行代码的上下文
- Swift编译器对代码进行检查,可以避免并发错误
- 任务必须被明确的创建(编译器不会隐式创建任务)
二、任务详解
2.1 Async-let 任务
这是一个普通的绑定,这个流程对于大部分里了解Swift读者都是比较熟悉的。
普通绑定
通过添加async关键字,则创建了一个Async-let任务,以下流程图描述了此执行流程。
异步绑定
以下是一个Async-let任务的实例。
具有并发能力的异步let绑定
fetchOneThumbnail函数是一个父任务,两个async-let语句创建了两个子任务。父任务在子任务完成后才能完成;如果一个子任务抛出异常,另外一个子任务被标记为取消的,但是其子任务还是会运行。任务如果被取消,则其所有的子任务也被取消。
2.2 组任务
使用withThrowingTaskGroup 函数来创建任务组,任务组能够处理并发任务数量不确定的情况。添加到组内的子任务可以以任何顺序执行。
任务组
使用此方法规避多线程的问题注意
在上面的.group.async中对thumbnails[id]的赋值会引发问题(多线程的问题)
网友评论