swift 逃逸閉包和非逃逸閉包的區(qū)別

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í)行完畢了,是逃逸閉包。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容