PromiseKit:如何在 ObjC 中进行重试/轮询?
Posted
技术标签:
【中文标题】PromiseKit:如何在 ObjC 中进行重试/轮询?【英文标题】:PromiseKit: How to do retry / polling in ObjC? 【发布时间】:2019-03-29 09:27:21 【问题描述】: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
【问题讨论】:
【参考方案1】:由 PromiseKit 开发人员在Github 上回答:
- (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]; ]
【讨论】:
以上是关于PromiseKit:如何在 ObjC 中进行重试/轮询?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Swift 中使用 PromiseKit 和 Firebase?