1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/DKJone-RxSwift-document-translation

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Transforming_Operators.md 5.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 04:47 73ec4a0

Глава 4. Преобразование

Преобразование следующего элемента события, отправленного из очереди observable

map

Применяется преобразование замыкания для отправки очереди 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)
}

flatMap и flatMapLatest

Преобразует элементы, отправляемые из очереди 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.


scan

Начинается с начального значения и выполняет накопление с использованием замыкания, которое отправляет каждый накопленный результат. Подробнее.

[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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/DKJone-RxSwift-document-translation.git
git@api.gitlife.ru:oschina-mirror/DKJone-RxSwift-document-translation.git
oschina-mirror
DKJone-RxSwift-document-translation
DKJone-RxSwift-document-translation
master