Создание реактивного API с помощью RxSwift

Я погружаюсь в RxSwift и хочу создать «потоковый API» для одного из моих обычных вызовов API.

Моя идея состоит в том, чтобы принять обычный вызов (который уже использует наблюдаемые без каких-либо проблем) и заставить таймер запускать такие вызовы и отправлять результаты на том же наблюдаемом, чтобы контроллер представления мог обновляться автоматически, поэтому вместо этого (псевдокод следует) :

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, но не уверен, что это правильный путь.

Любые указатели на то, как это сделать правильно?

Конечная цель - перезапустить таймер только после завершения предыдущего вызова (успешного или неудачного).


person Nico    schedule 24.01.2016    source источник


Ответы (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 и отправляет результат на тот же наблюдаемый объект. Обратите внимание, что вы должны удалить интервал при удалении наблюдаемого maim.

person Guy Kahlon    schedule 28.01.2016