前言:本质是通过 task/await 来替代 nested mutiple trailing closure 来进行 回调的解耦
回调地狱的特点
- 多层嵌套:异步函数调用嵌套在另一个异步函数的回调中,层数可能非常深。
- 代码可读性差:由于闭包和函数调用深度嵌套,代码的流程难以一目了然。
- 错误处理复杂:在多层嵌套中处理错误变得复杂,每一层都可能需要错误处理逻辑。。
在这个例子中,loadPicture(from:completion:onFailure:)
函数通过使用多个完成处理器(completion handlers)来处理网络任务的成功和失败情况。这种设计可以让代码更加清晰地分离网络任务的处理逻辑:一部分处理成功结果,另一部分处理失败情况。相比于使用一个同时处理成功和失败的闭包,使用两个不同的闭包能让代码逻辑更具可读性和模块化。
示例解释
这个函数的核心目的是进行网络任务(如下载图片),并根据任务的结果调用相应的闭包进行处理。通过这种方式,可以将成功和失败的逻辑分开,从而简化每个闭包的逻辑。
函数签名
func loadPicture(from url: String, completion: @escaping (UIImage) -> Void, onFailure: @escaping (Error) -> Void) {
// 模拟网络请求
DispatchQueue.global().async {
// 模拟成功或失败的情况
let success = Bool.random()
if success {
// 模拟下载成功,返回图片
let image