解决方案 1
使用没有重试器的不同配置发出请求(没有重试器意味着retry
不会调用该方法)。然后在用户单击重试按钮时重试请求。
var customSessionManager = SessionManager()
customSessionManager.retrier = nil
customSessionManager.request( ... ) {
// request is being made with no retrier. Hence retry method will not be called.
}
解决方案 2
发出此网络请求时,.validate()
从请求中删除Alamofire
。这样,Alamofire
将不会验证响应是否具有不可接受的状态代码。该retry
方法不会被调用,我们可以编写逻辑来在用户按下重试按钮时重试请求。
解决方案 3
(在撰写此答案时,我尚未测试此方法。)
如果确实无法使用解决方案 1 或解决方案 2,您可以尝试递归调用该retry
方法,同时等待用户单击“取消”或“重试”按钮。当用户单击“取消”或“重试”按钮时,在 SingletonClass 中设置一个属性,并在重试方法中使用该相同属性的值来确定是否应重试或取消该请求。
SingletonClass.retryRequest = false // initial default value
SingletonClass.cancelRequest = false // initial default value
@IBAction func cancelButtonWasPressed(_ sender: AnyObject) {
SingletonClass.cancelRequest = true
}
@IBAction func retryButtonWasPressed(_ sender: AnyObject) {
SingletonClass.retryRequest = true
}
public func retry(_ request: Request, for session: Session, dueTo error: Error, completion: @escaping (RetryResult) -> Void) {
if SingletonClass.retryRequest && !SingletonClass.cancelRequest {
// This means the user clicked on the Retry button.
SingletonClass.retryRequest = false // reset the value back to false
completion(.retry)
} else if !SingletonClass.retryRequest && SingletonClass.cancelRequest {
// This means the user clicked on the Cancel button.
SingletonClass.cancelRequest = false
completion(.doNotRetry)
} else {
// Recursively call the retry method till the user clicks on either the Cancel or Retry button.
retry(request, for session, dueTo error, completion)
}
}