让所有端点等待一个确切的端点
Make all endpoints to wait one exact endpoint
我正在使用 Moya 来处理 HTTP 操作,通常我有一个 refreshToken()
。当一个请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的场景。如果它们与嵌套类型链接在一起,这不是问题,但不太可能一直如此。
更清楚地说我有 request1()
和 request2()
并假设它们执行单独的操作并且可以随时触发(例如在 viewDidLoad()
中调用一个,另一个在另一个 viewDidLoad()
中被调用)。当发生这种情况并且令牌已过期时,我的刷新请求将失败。 (statusCode: 400)
所以,我的问题是,如何让提供者等待 refresh()
操作完成?我的意思是提供者是其他端点。我希望他们等待 refresh()
端点是否打开。
如果您能提出一种使这更容易的方法,我将不胜感激。
我只是在启动 refresh()
操作时将一个名为 isTokenRefreshing
的变量设置为 true,并在发出请求之前检查了它。如果这是真的,我将所有请求存储在一个数组中,当 refresh()
完成时,我执行了另一个函数,该函数基本上将所有存储的请求存储在一个 for loop
中。
如果有人想看我可以分享的代码。请告诉我。
EDIT
这是我 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!")
})
})
}
}
我正在使用 Moya 来处理 HTTP 操作,通常我有一个 refreshToken()
。当一个请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的场景。如果它们与嵌套类型链接在一起,这不是问题,但不太可能一直如此。
更清楚地说我有 request1()
和 request2()
并假设它们执行单独的操作并且可以随时触发(例如在 viewDidLoad()
中调用一个,另一个在另一个 viewDidLoad()
中被调用)。当发生这种情况并且令牌已过期时,我的刷新请求将失败。 (statusCode: 400)
所以,我的问题是,如何让提供者等待 refresh()
操作完成?我的意思是提供者是其他端点。我希望他们等待 refresh()
端点是否打开。
如果您能提出一种使这更容易的方法,我将不胜感激。
我只是在启动 refresh()
操作时将一个名为 isTokenRefreshing
的变量设置为 true,并在发出请求之前检查了它。如果这是真的,我将所有请求存储在一个数组中,当 refresh()
完成时,我执行了另一个函数,该函数基本上将所有存储的请求存储在一个 for loop
中。
如果有人想看我可以分享的代码。请告诉我。
EDIT
这是我 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!")
})
})
}
}