4

Alamofire のサンプルRetrier コードを確認しています。

   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 {
                refreshTokens { [weak self] succeeded, accessToken, refreshToken in
                    guard let strongSelf = self else { return }

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

                    ...
                }
            }
        } else {
            completion(false, 0.0)
        }
    }

関数の最初の行にある方法と、クロージャー内にlock.lock()同じ行を渡す方法には従いません。 strongSelf.lock.lock()refreshTokens

shouldロック解除が実行されたときに最初のロックがメソッドの最後まで解放されない場合、最初のロックが保持されている間deferに2番目のロックがどのようにstrongSelf.lock.lock()正常に実行されるのでしょうか?

4

1 に答える 1