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
завершено.