ios - PromiseKit:如何在 ObjC 中进行重试/轮询?
问题描述
PromiseKit "Common Patterns"文档在 Swift 中。
如何在 Objective C 中编写重试/轮询代码?
重试/轮询
func attempt<T>(maximumRetryCount: Int = 3, delayBeforeRetry: DispatchTimeInterval = .seconds(2), _ body: @escaping () -> Promise<T>) -> Promise<T> {
var attempts = 0
func attempt() -> Promise<T> {
attempts += 1
return body().recover { error -> Promise<T> in
guard attempts < maximumRetryCount else { throw error }
return after(delayBeforeRetry).then(on: nil, attempt)
}
}
return attempt()
}
attempt(maximumRetryCount: 3) {
flakeyTask(parameters: foo)
}.then {
//…
}.catch { _ in
// we attempted three times but still failed
}
解决方案
由Github上的 PromiseKit 开发人员回答:
- (AnyPromise *) attempt:(NSUInteger) maximumRetryCount delayBeforeRetry:(NSTimeInterval) delay provider:(AnyPromise* (^)()) provide {
__block NSUInteger attempts = 0;
AnyPromise *(^attempt)() = ^{
attempts++;
return provide().catch(^(id error) {
if (attempts >= maximumRetryCount) @throw error;
return PMKAfter(delay).then(attempt);
});
};
return attempt();
}
然后,如果你有这样的方法:
- (AnyPromise *) myPromise {
return [AnyPromise promiseWithResolverBlock:^(PMKResolver resolve) {
...
resolve(nil) / resolve (error);
}];
}
调用它
[self attempt:3 delayBeforeRetry:2 provider:^{ return [self myPromise]; }]
推荐阅读
- python - 使用多处理从数据帧写入 csv 而不会弄乱输出
- javascript - Nodejs,获取文件的文件类型
- python - 是否有可能创建一个可能会寻找满足几个指定选项之一的列表?
- java - ListView 向下和向上滚动后,ListView 项目不注册点击
- php - 如何在不刷新页面的情况下在 MySQL 中插入数据,使用 AJAX 和 LARAVEL
- swift - AudioKit - 你如何将 AKMicrophone 的数据点击到双打数组?
- javascript - 从计时器功能中获取秒数到我的视图
- python - 由网格上的矩阵定义的函数的矢量化评估
- tensorflow - TensorFlow For Poets - 最佳图像尺寸
- javascript - 使用 JQuery 的行上的多个 div 高度列