RxSwift - Chaining Observables和Singles

问题描述 投票:1回答:1

我需要调用一系列函数来获取通知所需的所有信息。第一个订阅打开会话,然后queryNotification听取所有传入的通知,一旦收到通知,需要调用getNotificationAttrsnotificationId返回的queryNotification,然后调用getAppAttributesappIdentifier返回getNotificationAttrs我需要合并结果queryNotificationgetNotificationAttrsgetAppAttributes。函数的外观如下:

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,getNotificationAttrsgetAppAttributes都返回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
            }
       })

这可行吗?任何方向表示赞赏!谢谢!

swift reactive-programming rx-swift chaining method-chaining
1个回答
3
投票

最明显和恕我直言正确的解决方案是将你的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

    })

以上将遵循您概述的步骤,每次发出新通知时都会调用订阅。

还要注意上面的内容有点像同步代码(只需要一些额外的包装)。

© www.soinside.com 2019 - 2024. All rights reserved.