RxSwift выдает начальное значение с интервалом времени и изменяет его - PullRequest
0 голосов
/ 02 января 2019

Мне нужно уменьшать входное значение с каждой секундой и печатать его.Когда значение достигает 0, оно становится равным 100, и процесс уменьшения повторяется, и снова.

Например:

Given value: 
-> 234
Timer starts decreasing with every second
 -> 233
 -> 232 
...
 -> 1
 -> 0 and the whole process repeats,

but starts with value 100 
(and again decreasing, reaches 0, starting from 100)

Я знаю, как использовать таймер в Rx, а как его связать с описанным случаем?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Как насчет создания наблюдаемой из интервала в 1 секунду и другой наблюдаемой из последовательности чисел, а затем объединить их вместе? Как это:

let interval = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
let startValue1 = 234
let startValue2 = 100

let range1 = Observable
    .range(start: 0, count: startValue1 + 1)
    .map { startValue1 - $0 }

let range2 = Observable
    .range(start: 0, count: startValue2 + 1)
    .map { startValue2 - $0 }
    .repeatWithBehavior(.immediate(maxCount: .max))
    .subscribeOn(SerialDispatchQueueScheduler(qos: .background))

Observable.zip(
    interval,
    range1.concat(range2))
    .subscribe(onNext : { (_, remainingTime) in
        print("\(remainingTime)")
    })

Это немного многословно, но оно избегает любого изменяемого состояния. НТН

0 голосов
/ 02 января 2019

Вам нужна только одна переменная с начальным значением, как показано ниже:

var start = 234

func startTimer() {
     _ = Observable<Int>
          .timer(0, period: 1, scheduler: MainScheduler.instance)
          .subscribe(onNext: { _ in
              self.start -= 1
              if self.start <= 0 {
                  self.start = 100
              }
              print("Timer valuse>>>> : ",self.start)
          })
}
...