2017-03-18 9 views
0

リフレッシュトークンの動作をリクエストに自動的に追加するには、RequestAdapterRequestRetrierを採用しています。 再試行が制御なしで無期限に発生する問題。Alamofire:一度だけリクエストを再試行する方法

class AuthHandler: RequestAdapter, RequestRetrier { 

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest { 

     return urlRequest 

    } 

    public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { 

     if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 { 

      _ = Credential.current.renew({ (credential, error) in 
       completion(true, 0.0) /// Retry request 
      }) 

     } else { 

      completion(false, 0.0) // Don't retry 

     } 

    } 

} 

は、どのように私は一度だけ後に失敗した要求の再試行を行うことができます。 私はこのコードを持っていますか?

私はこの試みた:

request.retryCount = 1 

をしかし作品はありません...任意のアイデアを?

ありがとうございます!

答えて

1

retryCountは読み取り専用です。 retryCountの説明は次のとおりです。

要求が再試行された回数。

したがって、この再試行回数を確認して、retryCountが高すぎる場合は再試行をやめる必要があります。

は1回の試行の後に停止するには、このコードは動作します:

class AuthHandler: RequestAdapter, RequestRetrier { 

    func adapt(_ urlRequest: URLRequest) throws -> URLRequest { 
     return urlRequest 
    } 

    public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) { 

     guard request.retryCount == 0 else { return completion(false, 0) } // relevant change 

     if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 { 

      _ = Credential.current.renew({ (credential, error) in 
       completion(true, 0) /// Retry request 
      }) 

     } else { 
      completion(false, 0.0) // Don't retry 
     } 
    } 
} 

注:要求が再試行された最初の時間を、そのretryCountは、上記の我々のコード0である、私たちが作っているのを確認してくださいそれだけです最初の再試行では、retryCount == 0です。

関連する問題