Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 完成处理程序内部的完成处理程序?_Swift - Fatal编程技术网

Swift 完成处理程序内部的完成处理程序?

Swift 完成处理程序内部的完成处理程序?,swift,Swift,我与JWT tokens和Alamofire合作,与Swift合作。我的问题是,当请求返回nil时,我希望请求方法运行refreshToken()方法并重试HTTP请求。我的代码看起来像这样。我试着自己管理,但没有成功( //用于HTTP方法的内部方法 私有func请求(资源:资源,方法:Alamofire.HTTPMethod,参数:[String:String],完成:@escaping(A?)->()){ 让requestUrl=self.baseurl.absoluteString+re

我与JWT tokens和Alamofire合作,与Swift合作。我的问题是,当请求返回nil时,我希望请求方法运行refreshToken()方法并重试HTTP请求。我的代码看起来像这样。我试着自己管理,但没有成功(

//用于HTTP方法的内部方法
私有func请求(资源:资源,方法:Alamofire.HTTPMethod,参数:[String:String],完成:@escaping(A?)->()){
让requestUrl=self.baseurl.absoluteString+resource.url.absoluteString+“?token=“+self.loginManager.getFromKeychain().token!”!
请求(requestUrl,方法:方法,参数:参数)。响应{response in
//检查响应是否需要重新授权
if(response.response?.statusCode==401 | | response.response?.statusCode==400){
refreshtToken(完成:{结果为
如果(结果){
打印(“令牌已刷新”)
//我如何再次提出请求?
}
})
}
guard let data=response.data else{
完成(无)
返回
}
完成(resource.parse(数据作为NSData))
}
}
您的方法变成:

private func request<A>(resource: Resource<A>, method: Alamofire.HTTPMethod, parameters: [String:String], completion: @escaping (A?, error: Int?) -> ()) {

    let requestUrl = self.baseurl.absoluteString + resource.url.absoluteString + "?token=" + self.loginManager.getFromKeychain().token!

    Alamofire.request(requestUrl, method: method, parameters: parameters).response { response in

        // Check if response need reauth
        if(response.response?.statusCode == 401 || response.response?.statusCode == 400) {
            completion(nil, response.response?.statusCode)
        }

        guard let data = response.data else {
            completion(nil, nil)
            return
        }

        completion(resource.parse(data as NSData, nil)

    }
}
private func请求(资源:resource,方法:Alamofire.HTTPMethod,参数:[String:String],完成:@escaping(A?,错误:Int?)->()){
让requestUrl=self.baseurl.absoluteString+resource.url.absoluteString+“?token=“+self.loginManager.getFromKeychain().token!”!
请求(requestUrl,方法:方法,参数:参数)。响应{response in
//检查响应是否需要重新授权
if(response.response?.statusCode==401 | | response.response?.statusCode==400){
完成(无,响应。响应?状态码)
}
guard let data=response.data else{
完成(无,无)
返回
}
完成(resource.parse(数据为NSData,nil)
}
}
以及您的方法调用的位置

func myMethod(resource: Resource<A>, method: Alamofire.HTTPMethod, parameters: [String:String]) { 
    self.request(resource: resource, method: method, parameters: parameters) { (result, errorCode) in 
    if let errorCode = errorCode {
        self.refreshToken(completion: { res in
            if(res) {
                print("Token got refreshed")

                // How do i make the request again?
                self.myMethod(resource: resource, method: method, parameters: parameters)
            }
        })
    }
    else if let result = result {
        //ok got a result
    }
}
func-myMethod(资源:资源,方法:Alamofire.HTTPMethod,参数:[String:String]){
中的self.request(资源:资源,方法:方法,参数:参数){(结果,错误代码)
如果让errorCode=errorCode{
refreshtToken(完成:{res in
如果(res){
打印(“令牌已刷新”)
//我如何再次提出请求?
self.myMethod(资源:资源,方法:方法,参数:参数)
}
})
}
如果let result=result,则为else{
//好的,有结果了吗
}
}

您可以向主方法完成处理程序添加更多参数,以便在收到401状态代码后再次提出请求。您可以给我举个例子吗?谢谢您的帮助!
func myMethod(resource: Resource<A>, method: Alamofire.HTTPMethod, parameters: [String:String]) { 
    self.request(resource: resource, method: method, parameters: parameters) { (result, errorCode) in 
    if let errorCode = errorCode {
        self.refreshToken(completion: { res in
            if(res) {
                print("Token got refreshed")

                // How do i make the request again?
                self.myMethod(resource: resource, method: method, parameters: parameters)
            }
        })
    }
    else if let result = result {
        //ok got a result
    }
}