zoukankan      html  css  js  c++  java
  • 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后打印 获取到了数据++
  • 相关阅读:
    springboot实现定时任务,异步操作,统一结果返回,全局异常处理,拦截器及事务处理
    springboot集成mybatis,热部署以及整合Swagger2
    使用idea上传项目到码云(gitee)上
    RabbitMQ 高级应用
    Spring Boot整合RabbitMQ
    RabbitMQ--其他几种模式
    RabbitMQ入门--简单模式
    RabbitMQ安装(centos7)
    RocketMQ安装及入门
    [UWP]涨姿势UWP源码——极简的RSS阅读器
  • 原文地址:https://www.cnblogs.com/ZhangShengjie/p/14282940.html
Copyright © 2011-2022 走看看