繁体   English   中英

iOS-未触发Alamofire RequestRetrier

[英]iOS - Alamofire RequestRetrier not provoked

我正在尝试实施一种重试机制,但我发现alamofire有一个。 我正在尝试实现一种简单的重试机制,该机制具有多次请求请求,但是出了点问题。

class OAuth2Handler: RequestAdapter, RequestRetrier {
  func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
    return urlRequest
 }

var defaultRetryCount = 4
private  var requestsAndRetryCounts: [(Request, Int)] = []
private  var lock = NSLock()

private func index(request: Request) -> Int? {
    return requestsAndRetryCounts.index(where: { $0.0 === request })
}

func addRetryInfo(request: Request, retryCount: Int? = nil) {
    lock.lock() ; defer { lock.unlock() }
    guard index(request: request) == nil else { print("ERROR addRetryInfo called for already tracked request"); return }

    requestsAndRetryCounts.append((request, retryCount ?? defaultRetryCount))
}

func deleteRetryInfo(request: Request) {
    lock.lock() ; defer { lock.unlock() }
    guard let index = index(request: request) else { print("ERROR deleteRetryInfo called for not tracked request"); return }

    requestsAndRetryCounts.remove(at: index)
}

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

    lock.lock() ; defer { lock.unlock() }

    guard let index = index(request: request) else { completion(false, 0); return }
    let (request, retryCount) = requestsAndRetryCounts[index]

    if retryCount == 0 {
        completion(false, 0)
    } else {
        requestsAndRetryCounts[index] = (request, retryCount - 1)
        completion(true, 0.5)
    }
 }
}

这是我正在尝试使用的类:

let sessionManager = SessionManager()

override init() {
    sessionManager.adapter = RequestAdapter.self as? RequestAdapter
    sessionManager.retrier = OAuth2Handler()
}


func sendRequest(url: String,meth: HTTPMethod,parameters: [String: AnyObject]?, success: @escaping (String, Data) -> Void, failure: @escaping (Error) -> Void) {

    self.asyncSerialWorker.enqueueWork { (done) in
        self.sessionManager.request(url, method:meth).responseJSON { (responseObject) -> Void in
            if responseObject.result.isSuccess {
                print("Generic succsess")
                let value = responseObject.result.value
                let json = JSON(value!)
                guard let result = responseObject.data else {return}
                success(self.parser.parseMaiden(json: json), result)
            }

            if responseObject.result.isFailure {
                let error : Error = responseObject.result.error!

                print("login failed")
                failure(error)
            }
            done()
        }
    }
} 

如果还有其他建议,我想听听他们的建议

谢谢

sessionManager.adapter = RequestAdapter.self as? RequestAdapter sessionManager.adapter = RequestAdapter.self as? RequestAdapter似乎非常错误。 您应该将其设置为OAuth2Handler的实例。

所以她的问题是将请求添加到重试中,所以首先我做到了:

let sessionManager = SessionManager()
var retrier = OAuth2Handler()

override init() {
    sessionManager.retrier = retrier
}

在通话本身中,我做了如下操作:

func sendRequest(url: String,meth: HTTPMethod,parameters: [String: AnyObject]?, success: @escaping (String, Data) -> Void, failure: @escaping (Error) -> Void) {
    let request = sessionManager.request(url, method: meth, parameters: parameters, encoding: JSONEncoding.default)
    retrier.addRetryInfo(request: request)

    self.asyncSerialWorker.enqueueWork { (done) in
        self.sessionManager.request(url, method:meth).responseJSON { (responseObject) -> Void in
            if responseObject.result.isSuccess {
                print("Generic succsess")
                let value = responseObject.result.value
                let json = JSON(value!)
                guard let result = responseObject.data else {return}
                success(self.parser.parseMaiden(json: json), result)
            }

            if responseObject.result.isFailure {
                let error : Error = responseObject.result.error!

                print("login failed")
                failure(error)
            }
            done()
        }
    }
}

如您所见,我已经向重试添加了一个请求:

              retrier.addRetryInfo(request: request)

也许我应该成功删除(将检查并更新)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM