根据闭包调用时的时机划分为逃逸闭包和非逃逸闭包。
一、非逃逸闭包
不需要其它特殊时机,只能在函数作用域内函数执行结束前被调用
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.test {
print("非逃逸")
}
}
func test(callback:()->()) {
print("1")
callback()
print("2")
}
}
给函数test传递一个闭包参数callback,此时闭包callback调用只能在函数作执行结束前被当做函数内的任务依次被执行,这种情况下的闭包就是非逃逸闭包。
二、逃逸闭包
不需要在函数结束前被调用,可以等到特定时机时才被调用
class ViewController: UIViewController {
var escapingCallback : (()->())?
override func viewDidLoad() {
super.viewDidLoad()
self.test {
print("逃逸")
}
escapingCallback?()
}
func test(callback:@escaping ()->()) {
escapingCallback = callback
}
}
给当前类声明一个闭包变量escapingCallback,将test函数内的闭包参数赋值给这个变量,此时这个闭包就可以在函数执行结束后或其他时候被调用。
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.test {
print("逃逸")
}
}
func test(callback:@escaping()->()) {
print("1")
DispatchQueue.main.asyncAfter(deadline: .now() + 1.0) {
callback()
}
print("2")
}
}
不需要在test函数结束前调用,等到1秒后再调用闭包callback。
逃逸闭包类型需要用@escaping标记