RxSwift-链接可观察对象和单项

时间:2019-02-22 20:09:03

标签: swift reactive-programming rx-swift chaining method-chaining

我需要调用一个函数序列来获取通知所需的所有信息。首先订阅将打开会话,然后queryNotification侦听所有传入的通知,接收到通知后,需要使用{{1}中返回的getNotificationAttrs来调用notificationId },然后使用queryNotification返回的getAppAttributes调用appIdentifier,我需要getNotificationAttrsqueryNotificationgetNotificationAttrs的组合结果。函数的外观如下:

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> 返回Observable,而queryNotificationgetNotificationAttrs都返回Single。我将它们链接在一起的想法就像:

getAppAttributes

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

1 个答案:

答案 0 :(得分: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

    })

以上内容将按照您概述的步骤进行,并且每次发出新通知时都会调用订阅。

还请注意,上面的内容与同步代码的读取方式非常相似(只是带有一些额外的包装)。