ios - PromiseKit:如何在 ObjC 中进行重试/轮询?

标签 ios objective-c promisekit

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
}

最佳答案

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]; }]

关于ios - PromiseKit:如何在 ObjC 中进行重试/轮询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55414224/

相关文章:

objective-c - 如果有人删除应用程序,CKSubscription 会发生什么情况?

ios - Swift - 带循环的多个链 http 请求

ios - Xcode6 beta4 的问题

ios - 为什么 Xcode 4 没有对我不完整的 UITableViewDataSource 协议(protocol)实现发出警告?

objective-c - NSScroller 图形故障/滞后

objective-c - SecKeychainGetPath 错误

swift - PromiseKit 手动安装

ios - PromiseKit 取消 promise

ios - For循环不改变变量

ios - 使用 YouTube 用户上传的 JSON 数据填充 TableView - iOS