我需要调用一个函数序列来获取通知所需的所有信息。首先订阅将打开会话,然后queryNotification
侦听所有传入的通知,接收到通知后,需要使用{{1}中返回的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>
返回Observable,而queryNotification
和getNotificationAttrs
都返回Single。我将它们链接在一起的想法就像:
getAppAttributes
这可行吗?任何方向表示赞赏!谢谢!
答案 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
})
以上内容将按照您概述的步骤进行,并且每次发出新通知时都会调用订阅。
还请注意,上面的内容与同步代码的读取方式非常相似(只是带有一些额外的包装)。