3

我正在使用Moya处理 HTTP 操作,通常我有一个refreshToken(). 当请求即将发生时,我正在检查令牌是否过期,但问题是可能存在多个请求的场景。如果它们与嵌套类型链接,则不是问题,但并非总是如此。

更清楚地说,假设我有request1()并且request2()假设它们执行单独的操作并且可以随时触发(例如,一个在 aviewDidLoad()中调用,另一个在 another 中调用viewDidLoad())。当发生这种情况并且令牌过期时,我的刷新请求将失败。(statusCode: 400)所以,我的问题是,我怎样才能让提供者等待refresh()操作完成?我的意思是提供者是其他端点。refresh()如果它打开,我希望他们等待端点。

如果您提出一种使这更容易的方法,我将不胜感激。

4

1 回答 1

1

我只是在开始操作时设置了一个名为isTokenRefreshingtrue的变量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!")
            })
        })

    }
}
于 2017-07-26T16:59:05.783 回答