swift 逃逸閉包和非逃逸閉包的區別
逃逸閉包:閉包做為函數的參數傳遞時,在函數體結束后被調用,我們就說這個閉包逃離了這個函數體的作用域,這個閉包是逃逸型的閉包,使用@escaping來標注。
非逃逸型的閉包:在函數體結束前被調用,閉包是非逃逸型的閉包。
class NetworkManger { func getUserInfo(phone: String?, success:@escaping (() -> Void), failure: ((_ errorMessage: String) -> Void)) { print("函數開始執行") guard let _ = phone else { print("執行了failure閉包") failure("電話號碼不能為空") return } //用來模擬網絡請求 let dataTask = URLSession.shared.dataTask(with: URL.init(string: "www.baidu.com")!) { (data, responmse, nil) in print("執行了success閉包") success() } dataTask.resume() print("函數執行結束") } } let netManger = NetworkManger() netManger.getUserInfo(phone: "123456", success: { print("刷新你的界面") }) { (errorMessage) in print(errorMessage) }
說明:
failure會在phone號碼為空的時候觸發,這個時候函數體未執行完畢,是非逃逸閉包。
success閉包是在一個異步線程中,當異步線程執行完畢后,我們才調用了success閉包,此時函數體已經執行完畢了,是逃逸閉包。