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