私はいくつかのAlamofire sample Retrierコード見直している:私はあなたが関数の最初の行にlock.lock()
を持っているし、その後もrefreshTokens
に渡されたクロージャ内の同じラインstrongSelf.lock.lock()
を持つことができる方法に従わないNSLock.lock()はすでにロックされている間に実行されましたか?
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)
}
}
を。
defer
ロック解除は、次に実行されるときに最初のロックがshould
方法が終了するまで解放されない場合、最初のロックが保持されている間どのように第二strongSelf.lock.lock()
を正常に実行しますか?