Swift中的逃逸闭包的理解

2018-11-27  本文已影响0人  大佬的世界我不懂

逃逸闭包的书面定义:一个传入函数的闭包如果在函数执行结束之后才会被调用,那么这个闭包就叫做逃逸闭包。

对定义的理解

通过定义我们知道,逃逸闭包首先是一个闭包(感觉有点废话),但是逃逸闭包又不是普通的闭包,因为它会在函数结束后才执行(这是特点)。

什么闭包会在函数执行之后才执行呢?

很多启动异步操作的函数接受一个闭包参数作为 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("当前网络不可用,请检查网络设置")

            }

        }

    }

上一篇下一篇

猜你喜欢

热点阅读