Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使所有端点等待一个确切的端点_Ios_Swift_Multithreading_Grand Central Dispatch_Moya - Fatal编程技术网

Ios 使所有端点等待一个确切的端点

Ios 使所有端点等待一个确切的端点,ios,swift,multithreading,grand-central-dispatch,moya,Ios,Swift,Multithreading,Grand Central Dispatch,Moya,我正在使用来处理HTTP操作,通常我有一个refreshtToken()。当一个请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的情况。如果它们与嵌套类型链接在一起,则这不是问题,但也不可能总是这样 更清楚地说,假设我有request1()和request2(),并假设它们执行单独的操作,并且可以随时触发(例如,一个在viewDidLoad()中调用,另一个在另一个viewDidLoad()中调用)。发生这种情况时,如果令牌过期,我的刷新请求将失败(statusCode:400)

我正在使用来处理HTTP操作,通常我有一个
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。我只是在寻找解决办法。