#ios #swift #rx-swift
#iOS #swift #rx-swift
Вопрос:
Я пытаюсь объявить все свои подписки в одном месте и без каких-либо промежуточных реле или триггеров. Вот чего я пытаюсь достичь.
У меня есть a Signal<X>
, который начнет получать значения только после загрузки всего остального, и это работает нормально. Но теперь мне нужно ввести другой Observable<Y>
, который, когда я подписываюсь, начнет немедленно выдавать значения, потому что он извлекает данные из базы данных. Это немного проблематично, потому что мой пользовательский интерфейс еще не готов показывать результаты, и он будет готов только тогда, когда Signal<X>
выдаст свое первое значение. После этого я хочу получить каждое отдельное значение Observable<Y>
.
Я пытался, skipUntil
и все в порядке, но я теряю первый элемент Observable<Y>
. switchLatest
также не будет подходящим совпадением. Я также изучал amb
, но это также не даст мне правильных результатов, поскольку оно подписывается на обе последовательности, а это не то, что мне нужно.
Мой вопрос таков: есть ли возможность подписаться на другие Наблюдаемые только после того, как исходная Наблюдаемая получила одно значение? А также поддерживать эту подписку, чтобы она реагировала на новые значения.
Комментарии:
1. skipUntil делает именно то, что вам нужно, что вы имеете в виду, когда теряете первый первый элемент из Observable<Y> ?
2. Вы не даете здесь много подробностей. Что означает «после загрузки всего остального»? Означает ли это, что X выдает при вызове viewDidLoad? Что именно такое
X
и нужно ли вам это создаватьY
?X
Выдает более одного раза? Вы говорите, чтоObservable<Y>
извлекает значения из базы данных, но затем подразумеваете, что он выдает несколько раз. Это локальная база данных или сетевой запрос?
Ответ №1:
Похоже, что простая плоская карта или одна из ее производных — это все, что вам нужно. Многое зависит от того, как часто X и Y излучают и что вы хотите делать, когда X излучает после первого раза.
Вы можете узнать больше, прочитав эту статью, но приведенные ниже мраморные диаграммы представляют собой достойное резюме (они предполагают, что по умолчанию наблюдается «холодное» или ленивое наблюдение. Если y
жарко, то все по-другому.):
x.flatMap { _ in y }
x ---1---2---3---|
y --A--B--C--|
y --D--E--F--|
y --G--H--J--|
--
------A--BD-CEG-FH--J--|
или
x.flatMapFirst { _ in y }
x ---1---2---3---|
y --A--B--C--|
--
------A--B--C--|
или
x.flatMapLatest { _ in y }
x ---1---2---3---|
y --A
y --D
y --G--H--J--|
--
------A---D---G--H--J--|
или
x.concatMap { _ in y }
x ---1---2---3---|
y --A--B--C--|
y --D--E--F--|
y --G--H--J--|
--
------A--B--C-----D--E--F-----G--H--J--|
Все зависит от того, какое поведение вы хотите.
Комментарии:
1. Вы были правы. Пока я искал какое-то сложное решение
dlatMapFirst
, это было именно то, что я искал. Спасибо!