Ios 使所有端点等待一个确切的端点
我正在使用来处理HTTP操作,通常我有一个Ios 使所有端点等待一个确切的端点,ios,swift,multithreading,grand-central-dispatch,moya,Ios,Swift,Multithreading,Grand Central Dispatch,Moya,我正在使用来处理HTTP操作,通常我有一个refreshtToken()。当一个请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的情况。如果它们与嵌套类型链接在一起,则这不是问题,但也不可能总是这样 更清楚地说,假设我有request1()和request2(),并假设它们执行单独的操作,并且可以随时触发(例如,一个在viewDidLoad()中调用,另一个在另一个viewDidLoad()中调用)。发生这种情况时,如果令牌过期,我的刷新请求将失败(statusCode:400)
refreshtToken()
。当一个请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的情况。如果它们与嵌套类型链接在一起,则这不是问题,但也不可能总是这样
更清楚地说,假设我有request1()
和request2()
,并假设它们执行单独的操作,并且可以随时触发(例如,一个在viewDidLoad()
中调用,另一个在另一个viewDidLoad()
中调用)。发生这种情况时,如果令牌过期,我的刷新请求将失败(statusCode:400)
所以,我的问题是,如何让提供者等待刷新()
操作完成?我的意思是提供者是其他端点。我希望他们等待refresh()
endpoint(如果启用)
如果您能提出一种更简单的方法,我将不胜感激。当我启动
refresh()
操作时,我刚刚设置了一个名为isTokenRefreshing
的变量,并在发出请求之前检查了它。如果是真的,我将所有请求存储在一个数组中,当refresh()
完成时,我执行了另一个函数,该函数基本上将所有存储的请求存储在for循环中
如果有人想看我可以分享的代码。请告诉我
编辑
在这里,我,NetworkManager
,处理我的所有请求。它在一个单例类中
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
。如果您不知道我在说什么,请参阅Moya
文档
这就是我处理令牌
操作的地方
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!")
})
})
}
}
每次在调用请求之前,都要检查刷新令牌是否过期。如果是,则通过服务接收刷新令牌,然后发出请求。可以肯定的是,这正是你想要的,对吗?如果是,那么我们可以使用闭包和刷新令牌的全局(bool)值来完成。在每个请求之前,我已经在检查刷新令牌是否过期。但是,由于网络操作的my manager是异步的,有时会在短时间内发出两个不同的请求,它们分别发出刷新令牌的请求。因此,我从第二个得到了400。我只是在寻找解决办法。