【问题标题】:Ensuring method scope is not completed until URLSession data task is completed in Swift 4在 Swift 4 中完成 URLSession 数据任务之前,确保方法范围没有完成
【发布时间】:2018-06-04 10:26:33
【问题描述】:

我希望我的应用程序返回到原始 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 不再被触发。

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

【问题讨论】:

  • 我不明白这个问题,从上面的代码中调用“getDataFromServer”它首先获取访问令牌然后执行api请求。
  • 放置一个断点并确保在renewAccessToken 中调用完成处理程序。
  • @TodorBrachkov 调用了 renewAccessToken 的完成处理程序,但它不返回 getAccessTokenValue。问题是当在 renewAccessToken 中调用 task.resume() 时,它会到达 getAccessTokenValue 的末尾,然后到 getDataFromServer 的末尾,然后返回到我调用 getDataFromServer 的位置。控件返回 renewAccessToken 中的 dataTask,但完成后它不会返回 getAccessTokenValue。
  • @TodorBrachkov - 解决了这个问题。当 API 失败时没有调用完成处理程序是一个问题。我添加了它,现在它完美运行。谢谢你:)
  • 很高兴您解决了它,抱歉回复晚了。

标签: ios closures swift4 nsurlsessiondatatask urlsession


【解决方案1】:

解决了这个问题。当 API 失败时没有调用完成处理程序是一个问题。我添加了它,现在它可以完美运行了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多