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()
正常に実行されるのでしょうか?