在Swift 4中完成URLSession数据任务之前,确保方法范围未完成

时间:2018-06-04 10:26:33

标签: ios closures swift4 nsurlsessiondatatask urlsession

我希望我的应用程序返回到原始的API调用。以下是示例代码:

func getDataFromServer()
{
   guard let apiUrl = URL(string: endPoint) else {
        return
    }
    getAccessTokenValue( completionHandler:{ accesstoken in
        //if access token is valid continue to get data
        //.......
         let task = self.apiSession.dataTask(with: apiRequest, completionHandler:  {
            (data, response, error) in
             //Manage response/data/error
           })
           task.resume()
        })

}


func getAccessTokenValue(completionHandlerResult : @escaping (_ accesstoken : String) -> ())
{
  var hasAccessTokenExpired = true
  // do some calculation

  //check if access token has expired
  if hasAccessTokenExpired
  {
     self.renewAccessToken(completionHandler: { accessTokenValue in

      completionHandlerResult(accessTokenValue)})
  }
  else{
       completionHandlerResult( accessToken) //return the current access token
  }

}


func  static func renewAccessToken (completionHandler : @escaping   (_ accessTokenValue:String) -> ()) //
{
    //another API call to refresh Access Token
    //.......
         let task = self.apiSession.dataTask(with: apiRequest, completionHandler:  {
            (data, response, error) in
             //Manage response/data/error
             //read access token from response
             completionHandler(accessToken)
           })
           task.resume()

}

我遇到的问题是当我的访问令牌不再有效时,会触发刷新令牌的API,但是当完成renewAccessToken中的数据任务时,我的应用程序已经执行了getAccessTokenValue和getDataFromServer的结束。因此,在获取刷新的访问令牌(在getDataFromServer的getAccessTokenValue的完成处理程序中)之后应该执行的API不再被触发。

我无法弄清楚我哪里出错了。

1 个答案:

答案 0 :(得分:0)

解决了这个问题。当API失败时,没有调用完成处理程序是一个问题。我补充说,现在它完美无缺。