ios - 让所有端点等待一个确切的端点

标签 ios swift multithreading grand-central-dispatch moya

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

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

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

最佳答案

我只是在启动 refresh() 操作时将名为 isTokenRefreshing 的变量设置为 true,并在发出请求之前检查了它。如果它是真的,我将所有请求存储在一个数组中,当 refresh() 完成时,我执行另一个函数,它基本上使所有存储的请求进入一个 for 循环

如果有人想看我可以分享的代码。请告诉我。

EDIT

这是我 NetworkManager 处理我所有请求的地方。它位于 Singleton 类 中。

    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 文档。

这是我处理我的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!")
            })
        })

    }
}

关于ios - 让所有端点等待一个确切的端点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40853682/

相关文章:

ios - 链接依赖的 API 调用

iOS。 CLLocationManager 在 didUpdateLocations 中仅接收一次位置更新

android - 在嵌套 fragment 中运行多个 AsyncTasks 时挂起线程,这会使应用变慢

multithreading - 有关QThread实现的问题

ios - '(@lvalue Int) -> $T 7' is not identical to ' 字典 <Int,Int>'

ios - 如何为 UITextField 设置 inputDelegate?

ios - 如何在 Storyboard 中自动调整我的 View 大小? swift 3

ios - 显示 UIAlert 会使应用程序崩溃吗?

Swift:插入带文本输入的警告框(和存储文本输入)

Java : threads are limited to 25% of the CPU