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