使用 RxSwift 创建“反应式”API

Posted

技术标签:

【中文标题】使用 RxSwift 创建“反应式”API【英文标题】:Creating a "reactive" API with RxSwift 【发布时间】:2016-01-24 03:20:31 【问题描述】:

我正在尝试使用 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】:

您应该执行以下代码:

  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。

【讨论】:

以上是关于使用 RxSwift 创建“反应式”API的主要内容,如果未能解决你的问题,请参考以下文章

Swft3 (RxSwift, RxCocoa) - TableView 使用响应式编程展开和折叠概念

将 UIApplicationDelegate 方法转换为 RxSwift Observables

使用 RxSwift 进行分页 API 调用

Rxswift 改变观察对象的值

反应式 Swift 使用来自 API 的实时数据 - 需要基本示例

Angular 2 使用嵌套组件创建反应式表单