• 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后打印 获取到了数据++
  • 相关阅读:
    sqlite设置主键
    sqlite 分页
    Server.Transfer方法在页面间传值
    JS实现背景透明度可变,文字不透明的效果
    css hack 区分浏览器
    Asp.net(c#)实现多线程断点续传
    C# 中的委托和事件
    使用C#的HttpWebRequest访问网站
    相似图片搜索的原理
    asp.net内存溢出问题
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/14282940.html
Copyright © 2020-2023  润新知