ios - RequestRetrier Alamofire 锁不工作

标签 ios swift alamofire

我正在使用 Alamofire 实现 RequestRetrier 以刷新给定用户的 accessToken。

func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
    lock.lock() ; defer { lock.unlock() }

    if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
        requestsToRetry.append(completion)

        if !isRefreshing {
            refreshToken(completion: { [weak self] succeded, accessToken in

                guard let strongSelf = self else { return }

                strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() }

                strongSelf.requestsToRetry.forEach{ $0(succeded, 0.0) }
                strongSelf.requestsToRetry.removeAll()
            })
        }
    } else {
        completion(false, 0.0)
    }
}

strongSelf.lock.lock() ; defer { strongSelf.lock.unlock() } 被调用它不会继续执行所以我有一个无限循环。我尝试检查 strongSelf.lock.try() 的结果并返回 false。

当我使用错误的密码登录时会发生这种情况,因此服务器返回 401。

这是我的refreshToken代码

guard !isRefreshing else { return }

// ... Get user ... //
if let user = user {

    isRefreshing = true
    signIn(user: userDTO)
        .subscribe(onNext: { [weak self] userSession in
            guard let strongSelf = self else { return }
            // ... Save accessToken ... //
            completion(true, userSession.accessToken)
            strongSelf.isRefreshing = false
        }, onError: { [weak self] error in
            guard let strongSelf = self else { return }
            // ... Log out user ... //
            completion(false, nil)
            strongSelf.isRefreshing = false
        })
        .disposed(by: bag)
} else {
        completion(false, nil)
}

最佳答案

如 Github 问题 https://github.com/Alamofire/Alamofire/issues/2544 中所示我可以通过更改来解决此问题:

private let lock = NSLock()

private let lock = NSRecursiveLock()

它们之间的区别在于,如果同一个线程试图锁定,递归锁可以被解锁。

关于ios - RequestRetrier Alamofire 锁不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51300379/

相关文章:

android - Xamarin PCL 与 SL 混淆

arrays - 在标签中显示 10 个整数的数组

ios - SwiftDate 5.0 编译问题

ios - 我的问题是我无法在 ios 13 和 xcode 11 中发出任何网络请求

ios - 类变量分配在 Alamofire 请求 block 内不起作用

ios - Swift 如何在 AppDelegate 中发送电子邮件 fetch?

ios - 在 Swift 3 中添加单元格之间的空间

ios - 将 json 响应传递给 iOS 中的另一个 View Controller

swift - 无法使用 * 类型的对象调用 $function

ios - 归档时 : A struct gives "Redundant protocol error", 而不是运行时