我需要调用一系列函数来获取通知所需的所有信息。第一个订阅打开会话,然后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
}
})
这可行吗?任何方向表示赞赏!谢谢!
最明显和恕我直言正确的解决方案是将你的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
})
以上将遵循您概述的步骤,每次发出新通知时都会调用订阅。
还要注意上面的内容有点像同步代码(只需要一些额外的包装)。