Swift 闭包实现回调

前言

之前分享了协议实现回调的方法,后来经过更多的学习才知道闭包也能很轻松的实现回调。
闭包分为逃逸闭包和非逃逸闭包两种,下面就来举两个小例子来对比下两种闭包吧。

逃逸闭包:

概念:一个接受闭包作为参数的函数,该闭包可能在函数返回后才被调用,也就是说这个闭包逃离了函数的作用域,这种闭包称为逃逸闭包。例如网络请求。

代码实现:

override func viewDidLoad() {
    super.viewDidLoad()
    escapingClosure { (info) in
        print("逃逸闭包回调结果:\(info)")
    }
}

func escapingClosure(setData:@escaping (Any) -> Void) {
    print("开始调用逃逸闭包")
    DispatchQueue.global().async {
       DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
           setData("escaping")
       })
   }
    print("逃逸闭包结束")
}

输出结果:

Swift 闭包实现回调_第1张图片

回调结果是延迟了一秒钟打印出来的。由此可见:逃逸闭包的生命周期是长于函数的,函数退出的时候,逃逸闭包的引用仍被其他对象持有,不会在函数结束时释放。

非逃逸闭包:

概念:一个接受闭包作为参数的函数,闭包是在这个函数结束前内被调用。

代码实现:

override func viewDidLoad() {
    super.viewDidLoad()
    noescapingClosure { (info) in
        print("非逃逸闭包回调结果:\(info)")
    }
}

func noescapingClosure(setData: (Any) -> Void) {
    print("开始调用非逃逸闭包")
    setData("noescaping")
    print("非逃逸闭包结束")
}

输出结果:

Swift 闭包实现回调_第2张图片

非逃逸闭包在函数结束前被正常调用。

比较有意思的是,Swift的1,2版本默认逃逸闭包,从第3版本开始默认非逃逸闭包,应该也是为了内存优化,上面两个小例子还是比较清晰的,希望大家以后能正确使用闭包,避免内存浪费哈。

你可能感兴趣的:(Swift,回调,swift,ios,函数闭包)