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이 너무 높으면 재 시도를 중지하면됩니다.

하나 재시도 후 중지하려면,이 코드는 작동합니다 :

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.