swift中闭包和逃逸闭包 [Escaping Closures] 的区别

1 、官方连接

2、所谓的逃逸闭包 即指 当闭包作为函数的参数传入时 默认情况下 函数执行完毕 闭包中的代码也就执行完了 方法中的变量和传入的闭包也就释放了

如果想要传入的闭包不受当前函数的控制(即函数执行完成之后、闭包也能单独执行)、这个时候闭包就要以逃逸闭包的形式传入 即在闭包前加上关键字 @escaping

注意: 在逃逸闭包中如果要使用当前对象的属性或者方法 需 加上 self

3、参考代码:

/// 存储闭包的数组
var completionHandlers = [() -> Void]()
/// 执行完成后 讲传入的闭包保存到定义的闭包数组中 由于传入的闭包生命周期不受当前函数控制 即需要定义为逃逸闭包
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
    completionHandlers.append(completionHandler)
}
/// 普通函数 执行函数 -> 执行函数中的闭包
func someFunctionWithNonescapingClosure(closure: () -> Void) {
    closure()
}

class SomeClass {
    var x = 10
    func doSomething() {
        someFunctionWithEscapingClosure { self.x = 100 }
        someFunctionWithNonescapingClosure { x = 200 }
    }
}

let instance = SomeClass()
instance.doSomething()
print(instance.x)
// Prints "200"

completionHandlers.first?()
print(instance.x)
// Prints "100"

 4、实际应用

class someVC {
    func getData(result: @escaping (String) -> Void) {
        print("开始获取数据")
        DispatchQueue.global().async {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) {
                result("数据++")
            }
        }
        print("结束获取数据")
    }
}

let vc = someVC()
vc.getData { data in
    print("获取到了\(data)")
}
//开始获取数据
//结束获取数据
//2s后打印 获取到了数据++

 

posted @ 2021-01-15 16:49  ZhangShengjie  阅读(667)  评论(0)    收藏  举报