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后打印 获取到了数据++