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 中进行重试/轮询?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PromiseKit 重构快速回调以承诺

PromiseKit 手动安装

如何在 Swift 中使用 PromiseKit 和 Firebase?

如何使用 PromiseKit 在 Swift 3 中手动触发 Promise

如何在 PromiseKit 6 中使用循环?

如何在 PromiseKit 中设置 when(fulfilled:)?