RxSwift - сцепление наблюдаемых и одиночных - PullRequest
0 голосов
/ 22 февраля 2019

Мне нужно вызвать последовательность функций, чтобы получить всю информацию, необходимую для уведомления.Сначала подпишитесь, чтобы открыть сеанс, затем queryNotification, чтобы прослушать все входящие уведомления, и как только уведомление получено, нужно позвонить getNotificationAttrs с notificationId, возвращенным в queryNotification, затем вызвать getAppAttributes сappIdentifier возвращается в getNotificationAttrs, и мне нужен объединенный результат queryNotification, getNotificationAttrs и getAppAttributes.Как выглядят функции ниже:

func subscribeNotification() -> Single<Info>
func queryNotification() -> Observable<Notification>
func getNotificationAttrs(uid: UInt32, attributes: [Attribute]) -> Single<NotificationAttributes>
func getAppAttributes(appIdentifier: String, attributes: [AppAttribute]) -> Single<NotificationAppAttributes>

Хитрость в том, что queryNotification возвращает Observable и оба getNotificationAttrs и getAppAttributes возвращают Single.То, что я имею в виду, соединяя их вместе, выглядит так:

subscribeNotification()
    .subscribe(onSuccess: { info in
        queryNotification()
            .flatMap({ notification in 
                return getNotificationAttributes(uid: notification.uid, attributes: [.appIdentifier, .content])
            })
            .flatMap({ notifAttrs
                return getAppAttributes(appIdentifier: notifAttrs.appIdentifier, attributes: [.displayName])
            })
            .subscribe {
                // have all the result from last two calls
            }
       })

Это выполнимо?Любое направление ценится!Спасибо!

1 Ответ

0 голосов
/ 23 февраля 2019

Самым очевидным и ИМХО правильным решением является продвижение вашего Single в Observable.Кроме того, я не фанат первых subscribe, где это.Вы получаете пирамиду с отступами.

Я слежу за вашими комментариями о необходимости значений из всех queryNotification(), getNotificationAttrs(did:attributes:) и getAppAttributes(appIdentifier:attributes:) ...

let query = subscribeNotification()
    .asObservable()
    .flatMap { _ in queryNotification() }
    .share(replay: 1)

let attributes = query
    .flatMap { getNotificationAttrs(uid: $0.uid, attributes: [.appIdentifier, .content]) }
    .share(replay: 1)

let appAttributes = attributes
    .flatMap { getAppAttributes(appIdentifier: $0.appIdentifier, attributes: [.displayName]) }

Observable.zip(query, attributes, appAttributes)
    .subscribe(onNext: { (query, attributes, appAttributes) in

    })

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

Также обратите внимание на то, что приведенное выше чтение выглядит совсем как синхронный код (только с некоторым дополнительным переносом).

...