重试的延迟-rxswift



是否有优雅的解决方案用于为retry创建延迟?发生错误时,我想等待5秒钟,然后重新启动可观察的(retry

只需创建一个围绕 retry()包裹的primitivesequence扩展。(Swift5.1 rxswift 4.3.1)

extension PrimitiveSequence{
  func retry(maxAttempts: Int, delay: TimeInterval) -> PrimitiveSequence<Trait, Element> {
    return self.retryWhen { errors in
      return errors.enumerated().flatMap{ (index, error) -> Observable<Int64> in
        if index < maxAttempts {
          return Observable<Int64>.timer(RxTimeInterval(delay), scheduler: MainScheduler.instance)
        } else {
          return Observable.error(error)
        }
      }
    }
  }
}

用法示例:(重试3次,每个延迟2秒)

yourRxStream.retry(maxAttempts: 3, delay: 2)

这是Swift 4.0

的代码
// sample retry function with delay
private func sampleRetryWithDelay(){
    let maxRetry = 3
    let retryDelay = 1.0 // seconds
    let _ = sampleStreamWithErrors() // sample observable stream, replace with the required observable
        .retryWhen { errors in
            return errors.enumerated().flatMap{ (index, error) -> Observable<Int64> in
                return index < maxRetry ? Observable<Int64>.timer(RxTimeInterval(retryDelay), scheduler: MainScheduler.instance) : Observable.error(error)
            }
        }.subscribe(onNext:{ value in
            print("Result:(value)")
        })
}
// Sample stream with errors, helper function only - generating errors 70% of the time
private func sampleStreamWithErrors() -> Observable<Int>{
    return Observable.create { observer in
        let disposable = Disposables.create() {} // nothing to cancel, we let it complete
        let randomInt = Int(arc4random_uniform(100) + 1)
        if randomInt > 70 {
            observer.on(.next(randomInt))
            observer.on(.completed)
        } else {
            let sampleError = NSError(domain: "SampleDomain", code: randomInt, userInfo: nil)
            print("Result:Error:(randomInt)")
            observer.on(.error(sampleError))
        }
       
        return disposable
    }
}