Применяется преобразование замыкания для отправки очереди observable и возвращается новая очередь после преобразования. Подробнее.
[*] --(v)--> [observable queue]
|> map (closure)
|>--(v)-> [transformed queue]
Пример кода на Swift:
example("map") {
let disposeBag = DisposeBag()
Observable.of(1, 2, 3)
.map { $0 * $0 }
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}
Преобразует элементы, отправляемые из очереди Observable, и объединяет несколько в одну сигнальную очередь. Подробнее.
[*] --(v)--> [observable queue]
|> flatMap (closure)
|>--(v)-> [signal queue]
В этом примере используется структура Player для представления игрока с переменной score. Создаются два игрока: 👦🏻 с начальным счётом 80 и 👧🏼 с начальным счётом 90. Затем создаётся переменная player, которая может принимать значения этих игроков.
Далее используется оператор flatMap для преобразования элементов, отправляемых из переменной player. Оператор flatMap преобразует каждый элемент в очередь Observable, связанную с переменной score игрока. Затем эта очередь подписывается на вывод элементов с помощью оператора subscribe.
После этого в примере изменяются значения счёта игроков. В случае использования оператора flatMap, изменения счёта игрока 👦🏻 будут отражены в выводе, а изменения счёта игрока 👧🏼 — нет. Это связано с тем, что оператор flatMap сохраняет все предыдущие элементы в очереди, даже если они были преобразованы.
Если же использовать оператор flatMapLatest, то в выводе будут отражаться только последние изменения счёта игрока, независимо от того, кто из игроков изменил свой счёт.
Пример кода на Swift:
example("flatMap and flatMapLatest") {
let disposeBag = DisposeBag()
struct Player {
var score: Variable<Int>
}
let 👦🏻 = Player(score: Variable(80))
let 👧🏼 = Player(score: Variable(90))
let player = Variable(👦🏻)
player.asObservable()
.flatMap { $0.score.asObservable() } // Изменить flatMap на flatMapLatest для наблюдения за изменениями вывода
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
👦🏻.score.value = 85
player.value = 👧🏼
👦🏻.score.value = 95 // При использовании flatMap вывод будет, при использовании flatMapLatest вывода не будет
👧🏼.score.value = 100
}
В этом примере использование оператора flatMap может привести к неожиданным результатам. После присвоения значения player.value игроку 👧🏼, игрок 👧🏼 начнёт отправлять элементы. Однако предыдущая внутренняя очередь 👦🏻.score продолжит отправлять элементы. Если заменить flatMap на flatMapLatest, только последняя внутренняя очередь Observable (👧🏼.score) будет отправлять элементы, и установка 👦🏻.score.value не даст результата.
Фактически flatMapLatest представляет собой комбинацию операторов map и switchLatest.
Начинается с начального значения и выполняет накопление с использованием замыкания, которое отправляет каждый накопленный результат. Подробнее.
[initial value] --(v)--> [accumulator]
|> scan (closure)
|>--(v)-> [accumulated value]
Пример кода на Swift:
example("scan") {
let disposeBag = DisposeBag()
Observable.of(10, 100, 1000)
.scan(1) { aggregateValue, newValue in
aggregateValue + newValue
}
.subscribe(onNext: { print($0) })
.addDisposableTo(disposeBag)
}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )