首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS重试机制

iOS重试机制
EN

Stack Overflow用户
提问于 2018-09-16 11:33:22
回答 2查看 1.2K关注 0票数 1

因此,我试图为我的网络调用(第一层)构建一个重试功能。这是一项功能:

代码语言:javascript
复制
func retry<T>(_ attempts: Int, task: @escaping (_ success: @escaping (T) -> Void, _ failure: @escaping (String) -> Void) -> Void, success: @escaping (T) -> Void, failure: @escaping (String) -> Void) {
    task({ (obj) in
        success(obj)
    }) { (error) in
        print("Error retry left \(attempts)")
        if attempts > 1 {
            self.retry(attempts - 1, task: task, success: success, failure: failure)
        } else {
            failure(error)
        }
    }
}

执行情况如下:

代码语言:javascript
复制
func refreshSession(success: @escaping () -> Void, failure: @escaping (String) -> Void) {
    cameraProtocols?.refreshSession( success: {
        print("calling serverping")
        self.timer = Timer.scheduledTimer(withTimeInterval: 5.0, repeats: true, block: { (timer) in
            self.keepAlive(session: CameraManager.session, success: {
                print("serverping succsess")
                success()
            }, failure: { (error) in
                print(error)
                failure(error)
            })
        })
    }, failure: { (error) in
        print(error)
        failure(error)
    })
}

func keepAlive(session: String, success: @escaping () -> Void, failure: @escaping (String) -> Void) {
    cameraProtocols?.keepAlive(session: CameraManager.session, success: {
        print("server ping done!")
        NotificationCenter.default.post(name: Notification.Name(rawValue: "pingSuccess"), object: nil)
        success()
    }, failure: { (error) in
        print(error)
        self.retry(3, task: { (success, failure) in
            self.refreshSession(success: success, failure: failure)
        }, success: { (success) in
            print("refresh succsed from retry")
            success
        }, failure: { (e) in
            print("refresh failed from retry: \(e)")
            //TODO - handle error logic when to procced with the failure closure
            failure(error)
        })
        NotificationCenter.default.post(name: Notification.Name(rawValue: "faildPing"), object: nil)
    })
}  

当我故意不接“保持生命”的电话时,重试就不像我想要的那样有效,而且永远也不会停止。

对于一个新的功能有什么建议,或者如何修复?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-17 11:28:05

所以我找到了问题所在。重试功能可以正常工作,但是它会重复,因为我不会停止refreshSession中的计时器,所以在重复3次之后,它就会重复。

票数 0
EN

Stack Overflow用户

发布于 2018-09-16 11:39:18

我认为CircuitBreaker 是您所需要的

断路器背后的基本思想非常简单。将受保护的函数调用封装在断路器对象中,该对象监视故障。一旦故障达到一定的阈值,断路器就会发生跳闸,所有对断路器的进一步调用都会出现错误,根本不会发出受保护的呼叫。

请参阅

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52353684

复制
相关文章

相似问题

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