ReactiveCocoa - стратегия concat flatten не работает должным образом

Я начал изучать реактивное какао через пару дней, сегодня я играл с методом сглаживания реактивного какао (реактивный Swift), я попытался выполнить фрагмент, приведенный для сплющивания конкатов в документации Основные операторы. Вот фрагмент:

let (lettersSignal, lettersObserver) = Signal<String, NoError>.pipe()
let (numbersSignal, numbersObserver) = Signal<String, NoError>.pipe()
let (signal, observer) = Signal<Signal<String, NoError>, NoError>.pipe()

signal.flatten(.concat).observeValues { print($0) }

observer.send(value: lettersSignal)
observer.send(value: numbersSignal)
observer.sendCompleted()

numbersObserver.send(value: "1")    // nothing printed
lettersObserver.send(value: "a")    // prints "a"
lettersObserver.send(value: "b")    // prints "b"
numbersObserver.send(value: "2")    // nothing printed
lettersObserver.send(value: "c")    // prints "c"
lettersObserver.sendCompleted()     // prints "1, 2"
numbersObserver.send(value: "3")    // prints "3"
numbersObserver.sendCompleted()

В соответствии с документацией и интерактивной диаграммой визуализации (визуальная диаграмма RAC Marbles - Flatten(.concat), результат должен быть примерно таким,

Сначала он должен был печатать поток писем, т.е.

а, б, в

& после того, как letterStream завершится, он должен был напечатать поток чисел, т.е.

1, 2, 3

Таким образом, окончательный результат этого наблюдения должен был быть

[a, b, c, 1, 2, 3]

Тем не менее, каскадный вывод, который я вижу,

[a, b, c, 3]

почему это так? Почему печатается только последнее значение numberStream? Вместо того, чтобы печатать все значения числового потока после завершения потока букв.

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

1 ответ

Решение

Как упоминалось в слабом канале ReactiveSwift, это ожидаемый результат.

Цитирование документации:

Внешний поток событий запускается наблюдаемым. Каждый последующий поток событий не наблюдается, пока не завершится предыдущий.

Так numbersSignal отправит значения только один раз lettersObserver завершено.

Другие вопросы по тегам