【发布时间】:2019-11-08 01:01:29
【问题描述】:
我正在从 UI 执行网络任务。当 accessToken 过期时,响应将获得状态代码 499。我需要刷新 accessToken 并使用请求对象执行相同的请求。如果第二个请求成功(使用新的访问令牌),UI 应该得到成功响应。否则失败。
//********************* 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")))
}
}
}
【问题讨论】:
-
你知道怎么做吗?
-
是的。我得到了解决方案
标签: swift asynchronous callback access-token