逃逸闭包的书面定义:一个传入函数的闭包如果在函数执行结束之后才会被调用,那么这个闭包就叫做逃逸闭包。
对定义的理解
通过定义我们知道,逃逸闭包首先是一个闭包(感觉有点废话),但是逃逸闭包又不是普通的闭包,因为它会在函数结束后才执行(这是特点)。
什么闭包会在函数执行之后才执行呢?
很多启动异步操作的函数接受一个闭包参数作为 completion handler。这类启动异步操作的函数会在异步操作开始之后(即“启动异步操作”的函数已经执行完毕)立刻返回,但是闭包直到异步操作结束后才会被调用(即“启动异步操作”函数执行完毕后才被调用)。这中情况很完美的符合了逃逸闭包的定义……
下面是一个异步的网络请求在网络请求结束后才会调用sucess这个逃逸闭包进行回调
funcgetDataNew(url:String,params:Parameters,success:@escaping(_result:JSON)->(),failure:@escaping(_error:Any)->()){
lettemporaryToken = (HRDataSave.hr_getToken2() !="") ?HRDataSave.hr_getToken2() :HRDataSave.hr_getToken()
let headers: HTTPHeaders = ["Content-Type":"application/json","Accept": "application/json","X-Auth-Token":temporaryToken]
Alamofire.request("\(HR_BASE_URL)"+url, method: .post, parameters: params, encoding:JSONEncoding.default, headers: headers).responseJSON{ responsein
switchresponse.result{
case.success(letvalue):
letjson =JSON(value)
if(json["result"].intValue==0){
ifjson["code"].intValue>0{
ifjson["code"].intValue==100&& !popWindowsShow{
popWindowsShow=true
popWindowsAlertView(toptitle:"提示", message:loginTitle, sureBtnTitle:"知道了", cancleTitle:"", sureClick: {
letdeleagte =UIApplication.shared.delegateas!AppDelegate
deleagte.singlePointLanding()
signalRemove()
popWindowsShow=false
}, cancleClick: {
})
}else{
if!popWindowsShow{
returnJsonMsg(jsonMsg: json)
}
}
}else{
success(json)
}
}else{
failure(json["resultMsg"].stringValue)
UIApplication.shared.keyWindow?.noticeOnlyText(json["resultMsg"].stringValue)
}
case.failure(leterror):
//print("错误原因:\(error.localizedDescription)")
failure(error)
UIApplication.shared.keyWindow?.noticeOnlyText("当前网络不可用,请检查网络设置")
}
}
}