Повторная попытка старого запроса после обновления токена доступа - PullRequest
0 голосов
/ 26 июня 2019

Я выполняю сетевое задание из пользовательского интерфейса. По истечении accessToken ответ получит код состояния 499 . Мне нужно обновить accessToken и выполнить тот же запрос с объектом запроса. Если второй запрос выполнен успешно (с новым токеном доступа), пользовательский интерфейс должен получить ответ об успешном выполнении. В противном случае не удалось один.

//********************* UI Side ****************************
/// Fetching Topic list
private func loadTopics() {
    try! SDKCore.getInstance().getKbService().fetchKbTopics { (result) in
        switch result {
        case .success(let topics):
            self.topicList = topics
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        case .failed(let error):
            print(error.localizedDescription)
        }
    }
}


//********************* Service Class Example ****************************
public func fetchKbTopics(completionHandler: @escaping (ResultModel<[KBTopic], Error>) -> Void) {
    let request = GetKBTopics()

    Networking.shared.performRequest(request) { (response) in
        switch response {
        case .success(let response):
            do {
                let decoder = JSONDecoder()
                let result = try decoder.decode(GetKBTopics.Response.self, from: response.data!)
                completionHandler(.success(result))

            } catch let error {
                completionHandler(.failed(.unexpectedResponse(error)))
            }
        case .failed(let error):
            completionHandler(.failed(error))
        }
    }
}


//********************* Network Adapter ****************************
func performRequest<T: RequestModel>(_ request: T, completionHandler: @escaping (ResultModel<DataResponse<Any>, Error>) -> Void) {

    let adapterRequest = request.buildURLRequest()
    Alamofire.request(adapterRequest)
        .responseJSON { (response) in

            let statusCode = response.response?.statusCode ?? -1
            switch statusCode {
            case 200...299:
                completionHandler(.success(response))
            case 499:
                // Access token expired
                AuthService.tokenRefresh(completionHandler: { (result) in
                    switch result {
                    case .success(let resp):
                        self.performRequest(request) { (response) in }
                    case .failed( _):
                        completionHandler(.failed(.unexpectedResponse("Unexpected Response")))
                    }
                })
            default:
                completionHandler(.failed(.unexpectedResponse("Unexpected Response")))
            }
    }
}
...