ReactiveX, как приостановить наблюдаемое

Я использую ReactiveX в iOS / Swift ( RxSwift).

Допустим, у меня есть наблюдаемое:

let dataUpdates = ...

На что я подписан:

dataUpdates.subscribeNext({ data in
    // update tableView with data
    // maybe move to a difference cell with an animation
})

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

Так что все, что мне нужно, это приостановить излучение этого dataUpdates наблюдаемым.

Как мне этого добиться?

1 ответ

Используйте BehaviorSubject для создания клапана, который приостанавливает и возобновляет обновления. Обратите внимание, что тогда вам понадобится некоторая поддержка противодавления (т.е. буферизация) в dataUpdates для обновлений, которые приходят, когда клапан закрыт.

Так что в псевдокоде (я не код переключения, поэтому извините мой синтаксис)

// create a BehaviorSubject with default value true. It will always emit
// the latest value when subscribed to, thus it is kind of a variable
let valve = BehaviorSubject(value: true)

// we are only interested to get one `true` value. When the latest value
// received by the valve is `true`, this will give a value immediately when
// subscribed to. When the latest value is `false`, this will not give
// any events until it is true.
let openValve = valve.filter{$0}.take(1)

// for each data update, pass it through if the valve is open and otherwise
// start waiting for it to turn true
let pauseableDataUpdates = dataUpdates.concatMap{update in openValve.map { _ in update}}

// now when you start rendering, you do
valve.on(.Next(false))

// and after animation is done, you do
valve.on(.Next(true))
Другие вопросы по тегам