2016-01-24 4 views
2

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

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

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 к соединению, но я не могу понять как взять ссылку на раковину и передать ей aro und к методу, вызванному таймером, чтобы фактически отправить события вниз по каналу, учитывая, что обработчик для таймера должен быть автономным методом. Я пытался бросить расширения таймера блока от BlocksKit, но таймер был запущен каждую секунду вместо того, чтобы быть запущенным с заданным интервалом, который победил цель.

Я также читал об операторе Interval, но я не уверен, что это правильный путь.

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

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

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^