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

Posted

技术标签:

【中文标题】使所有端点等待一个确切的端点【英文标题】:Make all endpoints to wait one exact endpoint 【发布时间】:2016-11-28 21:17:39 【问题描述】:

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

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

如果您提出一种可以简化此操作的方法,我将不胜感激。

【问题讨论】:

每次调用请求之前,您都想检查刷新令牌是否过期。如果是,那么您通过服务接收刷新令牌,然后发出请求。可以肯定的是,这正是您正在寻找的,对吗?如果是,那么我们可以使用闭包和刷新令牌的全局(布尔)值来完成 我已经在每次请求之前检查刷新令牌是否过期。但是由于我的网络操作经理是异步的,有时会在短时间内发出两个不同的请求,它们分别发出刷新令牌的请求。因此,我从第二个中得到 400。我只是在寻找解决方案。 【参考方案1】:

当我启动refresh() 操作并在发出请求之前检查它时,我只是设置了一个名为isTokenRefreshing 的变量。如果是真的,我将所有请求存储在一个数组中,当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!")
            )
        )

    

【讨论】:

以上是关于使所有端点等待一个确切的端点的主要内容,如果未能解决你的问题,请参考以下文章

在执行下一个代码块之前等待多个 RxJS 调用

如何分析烧瓶端点?

如何以可编程方式等待进程启动端点

luogu题解 UVA1615 Highway

关于二分图结论的一些证明

单个休息“放置”端点是不是足以更新带有嵌套数组的文档?