避免嵌套RxSwift订阅

时间:2018-06-18 21:48:13

标签: ios nested subscription rx-swift

我必须使用彼此相关的2个数据库对象。我这样做的方式创建了嵌套订阅。我阅读了几个博客,但无法找到一种方法来取消嵌套订阅。任何指针都会受到赞赏。

主题包含子项列表。检索完所有孩子后,我需要打印"主题名称"在遍历所有孩子之后,+"子名称"。这是问题陈述的简化版本。唯一的问题是数据服务返回我需要订阅的数据库对象的可观察对象。

let ds = DatabaseService()    

func createBindings() {
    _ = ds.getTopics()
        .flatMapLatest{self.updateSections(array: $0)}
        .subscribe()
}

func updateSections(array: [Topics]) -> Observable<Void> {
    for topic in array {
        let children = topic.children
        for id in children {
            _ = ds.getChildWith(id: id).map { lo in
                //do business related stuff
                }
                .subscribe()
        }
    }
    return .never()
}

我想在flatMapLatest中避免另一个订阅。

1 个答案:

答案 0 :(得分:0)

您可以尝试将ctrl <- trainControl(method = "cv", number = 3, returnResamp = "all", savePredictions = "final", # needs to be final or all classProbs = FALSE, index = createMultiFolds(training$y, k = 3, times = 1)) 创建的流与combineLatest运算符合并。 (所有这些流都需要完成才能完成返回的流)。


它看起来应该像这样:

getChildWith(id: id)

P.S。尝试避免忽略let ds = DatabaseService() func createBindings() { _ = ds.getTopics() .flatMapLatest{self.updateSections(array: $0)} .subscribe() } func updateSections(array: [Topics]) -> Observable<Void> { let allStreams = array.flatMap { topic in topic.children.map { id in return ds.getChildWith(id: id).map { lo in //do business related stuff } } } return Observable.combineLatest(allStreams, { _ in () }) } ,您将永远不会释放该流。