2016-12-15 161 views
1

我正在与JWT令牌和Alamofire一起使用Swift。我的问题是,当请求返回nil时,我希望request-method运行refreshToken()方法并重试HTTP请求。我的代码看起来像这样。我试图自己跑,但没有成功。 :(完成处理程序内的完成处理程序?

// Internal method used for the HTTP methods 
private func request<A>(resource: Resource<A>, method: Alamofire.HTTPMethod, parameters: [String:String], completion: @escaping (A?) ->()) { 

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) { 

      self.refreshToken(completion: { result in 

       if(result) { 
        print("Token got refreshed") 

        // How do i make the request again? 

       } 

      }) 

     } 

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

     completion(resource.parse(data as NSData)) 

    } 

} 
+0

你可以给你的主要方法完成处理程序添加更多的参数,你的方法再次提出请求时,你会得到您的401状态代码 – guiltance

+0

您能给我举一个例子吗? –

回答

1

你的方法成为:

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) 

    } 
} 

哪里叫

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 
    } 
} 
+0

感谢您的帮助! –