使用RxSwift

时间:2016-01-24 03:20:32

标签: ios swift nstimer rx-swift

我正在向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运营商的信息,但我不确定这是否正确。

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

最终目标是让计时器仅在前一个呼叫结束(成功或失败)后重新启动。

1 个答案:

答案 0 :(得分: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 dispose时处理Interval。