2

私は RxSwift に足を踏み入れており、通常の API 呼び出しの 1 つに「ストリーミング API」を作成したいと考えています。

私の考えは、通常の呼び出し(すでに何の問題もなくオブザーバブルを使用しています)を取り、タイマーにそのような呼び出しを起動させ、同じオブザーバブルで結果を送信することです。これにより、View Controllerは自動的に更新できるため、これを行う代わりに(疑似コードが続きます) :

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 のブロック タイマー拡張機能を投入しようとしましたが、タイマーは指定された間隔で起動されるのではなく、1 秒ごとに起動され、目的を達成できませんでした。

オペレーターについても読みました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()
      }

    }
  }

上記のコードは、API.locationsRequest を 20 秒ごとに起動し、同じオブザーバブルで結果を送信します。メインのオブザーバブルが破棄されるときは、間隔を破棄する必要があることに注意してください。

于 2016-01-28T14:07:26.123 に答える