Обеспечение того, чтобы область действия метода не была завершена, пока задача данных URLSession не будет завершена в Swift 4 - PullRequest
0 голосов
/ 04 июня 2018

Я хочу, чтобы мое приложение вернулось к исходному вызову 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.Поэтому API, который должен был быть выполнен после получения обновленного токена доступа (в обработчике завершения getDataFromServer для getAccessTokenValue), больше не запускается.

Я не могу выяснить, в чем я ошибся.

1 Ответ

0 голосов
/ 04 июня 2018

Решена проблема.Это была проблема с обработчиком завершения, который не вызывался при сбое API.Я добавил это, и теперь это работает отлично.

...