我只是在开始操作时设置了一个名为isTokenRefreshing
true的变量refresh()
,并在发出请求之前对其进行了检查。如果是真的,我将所有请求存储在一个数组中,refresh()
完成后我执行另一个函数,该函数基本上将所有存储的请求放在一个for loop
.
如果有人想看到我可以分享的代码。让我知道。
编辑
我在这里NetworkManager
处理我的所有请求。它在一个Singleton class
.
private var awaitingRequests : [NetworkAPI] = []
func makeRequest(_ request: NetworkAPI){
if (Token.sharedInstance.isTokenRefreshing && request.requiresToken) {
self.awaitingRequests.append(request)
return
}
self.provider.request(){ result in ... }
}
func executeWaitedRequests(){
for request in self.awaitingRequests {
self.makeRequest(request)
}
}
NetworkAPI
主要enum
是我持有我的endpoint cases
. Moya
如果你不明白我在说什么,请参阅文件。
这就是我处理我的Token
操作的地方。
class Token {
static let sharedInstance = Token()
private init(){}
var isTokenRefreshing: Bool = false
func refresh(_ completion: @escaping ()->()){
self.isTokenRefreshing = true
print("refreshing token")
let queue = DispatchQueue(label: "com.asd.ads.makeRequest", attributes: DispatchQueue.Attributes.concurrent)
queue.sync(flags: .barrier, execute: {
NetworkManager.shared.makeRequest(.refresh(), completionHandler: { (success, error) in
self.isTokenRefreshing = false
if success{
completion()
NetworkManager.shared.executeWaitedRequests()
}
print("refrehing ended!")
})
})
}
}