前端之家收集整理的这篇文章主要介绍了
根据请求Swift“重试”逻辑,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以当我的
上传请求失败时,我对如何实现重试逻辑感到有点迷失.
这是我的代码,我想要一些指导如何做到这一点
func startUploading(failure failure: (NSError) -> Void,success: () -> Void,progress: (Double) -> Void) {
DDLogDebug("JogUploader: Creating jog: \(self.jog)")
API.sharedInstance.createJog(self.jog,failure: { error in
failure(error)
},success: {_ in
success()
})
}
@H_
403_6@
这是一个通用
解决方案,可以应用于任何没有参数的异步
函数,但回调除外.我只通过成功和失败回调来简化逻辑,进步不应该难以
添加.
所以,假设你的函数是这样的:
func startUploading(success: Void -> Void,failure: NSError -> Void) {
DDLogDebug("JogUploader: Creating jog: \(self.jog)")
API.sharedInstance.createJog(self.jog,failure: { error in
failure(error)
},success: {_ in
success()
})
}
匹配它的重试功能如下所示:
func retry(numberOfTimes: Int,task: (success: Void -> Void,failure: NSError -> Void) -> Void,success: Void -> Void,failure: NSError -> Void) {
task(success: success,failure: { error in
// do we have retries left? if yes,call retry again
// if not,report error
if numberOfTimes > 1 {
retry(numberOfTimes - 1,task: task,success: success,failure: failure)
} else {
failure(error)
}
})
}
并且可以像这样调用:
retry(3,task: startUploading,success: {
print("Succeeded")
},failure: { err in
print("Failed: \(err)")
})
如果它一直失败,上面将重试startUploading三次,否则将在第一次成功时停止.
编辑.具有其他参数的函数可以简单地嵌入到闭包中:
func updateUsername(username: String,failure: NSError -> Void) {
...
}
retry(3,{ success,failure in updateUsername(newUsername,success,failure) },success: {
print("Updated username")
},failure: {
print("Failed with error: \($0)")
}
)