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("逃逸闭包结束")
}

输出结果:

在这里插入图片描述

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

非逃逸闭包:

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

代码实现:

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

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

输出结果:

在这里插入图片描述

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值