首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Alamofire,会话管理器限制重试计数

Alamofire,会话管理器限制重试计数
EN

Stack Overflow用户
提问于 2016-09-26 22:17:26
回答 1查看 5.7K关注 0票数 9

我正在使用Alamofire的SessionManager向我的API服务发出请求。

有没有办法限制阿拉莫火的重试次数?

我正在使用新的RequestAdapter和RequestTrier协议在Alamofire v4中提供重试机制。

我想限制重试最多5次。如果在5次之后重试,一个新的请求不应该被完成。

代码语言:javascript
运行
复制
class VMRetrier: RequestAdapter, RequestRetrier {

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

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

    if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
        VMLogger.shared.debug(message: "Trying to get a token")
        let _ = AuthService.shared.login(email: "a@a.com", password: "test34")
                           .then(execute: { (response) in
                                completion(true, 0.0)
                           })
    }
    else {
        completion(false, 0.0)
    }
} }

用法:

代码语言:javascript
运行
复制
internal let sessionManager = SessionManager()

override init() {
    super.init()
    sessionManager.adapter = VMRequestAdapter()
    sessionManager.retrier = VMRetrier()
}

更新在alamofire中有一个新的提交以提供重试计数选项.阿拉莫火犯

EN

回答 1

Stack Overflow用户

发布于 2016-10-08 10:35:57

我已经用Alamofire的RequestRetrier协议解决了这个问题:

代码语言:javascript
运行
复制
class Retrier: RequestRetrier {

    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)
        }
    }
}

应以这种方式使用:

代码语言:javascript
运行
复制
let manager = SessionManager()
let retrier = Retrier()
// ...
manager.retrier = retrier

然后

代码语言:javascript
运行
复制
let request = manager.request(urlString, method: method, parameters: parameters, encoding: JSONEncoding.default, headers: headers)

retrier.addRetryInfo(request: request)

request.response { r in
    self.retrier.deleteRetryInfo(request: request)
}.responseApiJSON { (r: DataResponse<JSONObject>) in
    // You code here
}
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39713280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档