rx-swift 中的重复操作符

Sah*_*cem 2 reactive-programming ios swift rx-swift

我有一个函数可以向服务器发出 API 请求。我想循环它直到它返回false没有更多数据)。

func getData(id: Int) -> Observable<Bool> {
     return Observable.create { observer in
           // Alamofire request
           // parse data
           // if can decode, 
           //   return true and increment page's property 
           // otherwise false
           // error, if there's a problem
     }
}
Run Code Online (Sandbox Code Playgroud)
  • 第一次尝试:我试过使用takeWhile,比如 : getData(id).takeWhile {$0}。它只迭代我的函数 1x 次。
  • 第二次尝试:使用范围。这里的问题是,即使我的getData函数出错,循环也不会停止,而是继续!

    Observable.range(start: 1, count: 100)
      .enumerated()
      .flatMapLatest({ _ in
            self.getData(someID)
      })
      .subscribe(onNext: { _ in
           // save to DB
           observer.onNext(true)
           observer.onCompleted()
       }, onError: { error in
           observer.onError(error)
       })
       .disposed(by: self.disposeBag)
    
    Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点,rx风格?

Sla*_*oll 5

像这样的东西?

let callApiTrigger = BehaviorRelay<Bool>(value: true)

let callApiEnoughTimes = callApiTrigger.asObservable()
    .takeWhile { $0 }
    .flatMap { _ in
        return getData(someId)
    }
    .do(onNext: { (apiResult: Bool) in
        callApiTrigger.accept(apiResult)
    })
Run Code Online (Sandbox Code Playgroud)