2

我正在尝试 RxSwift,并想为我的一个常规 API 调用创建一个“流 API”。

我的想法是进行常规调用(它已经使用了 observables 而没有任何问题)并有一个计时器触发此类调用并将结果发送到同一个 observable 上,因此视图控制器可以自动更新,所以不要这样做(伪代码如下) :

func getLocations() -> Observable<[Location]> {
  return Observable<[Location]>.create {
    sink in
    NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
       json in
       return json.flatMap { Location($0) }
    }
  }
}

我希望发生这种情况(伪代码如下):

func getLocations(interval: NSTimeInterval) -> Observable<[Location]> {
  return Observable<[Location]>.create {
    sink in
    NSTimer(interval) {
      NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
        json in
        sink.onNext(json.flatMap { Location($0) })
      }
    }
  }
}

我尝试的最后一件事是将 NSTimer 添加到混合中,但我不知道如何获取对接收器的引用并将其传递给计时器调用的方法以实际将事件发送到管道中,因为计时器的处理程序必须在独立方法上。我尝试从 BlocksKit 中加入块计时器扩展,但计时器每秒触发一次,而不是按指定的时间间隔触发,这违背了目的。

我也读过关于Interval运营商的信息,但我不确定这是正确的方法。

关于如何做到这一点的任何指示?

最终目标是仅在前一个调用完成(成功或失败)后才重新触发计时器。

4

1 回答 1

2

您应该执行以下代码:

  func getLocations(interval: NSTimeInterval) -> Observable<[CLLocation]> {

    return Observable<[CLLocation]>.create { observer in

      let interval = 20.0

      let getLocationDisposable = Observable<Int64>.interval(interval, scheduler: MainScheduler.instance)
        .subscribe { (e: Event<Int64>) in

          NSURLSession.sharedSession.rx_JSON(API.locationsRequest).map {
            json in
            observer.onNext(json.flatMap { Location($0) })
          }
      }

      return AnonymousDisposable {
        getLocationDisposable.dispose()
      }

    }
  }

上面的代码每 20 秒触发一次 API.locationsRequest 并在同一个 observable 上发送结果,请注意,您必须在 maim observable 处置时处置 Interval。

于 2016-01-28T14:07:26.123 回答