【问题标题】:Nesting subscribe calls in RxSwift在 RxSwift 中嵌套订阅调用
【发布时间】:2018-08-02 07:05:17
【问题描述】:

我已经开始学习 RxSwift,但有些时候无法理解。执行请求后,我必须创建一个按钮。像这样:

textField.rx.text
    .flatMapLatest { text in
        return performURLRequest(text)
    }
    .subscribe(onNext: { request in

        // Create a button
        let button = UIButton()
        button.rx.tap
            .subscribe({ _ in

                // Action

            }).disposed(by: self.disposeBag)
        self.view.addSubview(button)
    })
    .disposed(by: disposeBag)

如何避免嵌套订阅调用?因为这种代码味道。

【问题讨论】:

    标签: ios swift nested rx-swift


    【解决方案1】:

    您可以使用flatMap 来避免嵌套订阅,例如(或空是可选的)

        textField.rx.text.orEmpty
            .flatMapLatest { text in
                return performURLRequest(text)
            }
            .flatMap { request -> Observable<Void> in
                // Create a button
                let button = UIButton()
                self.view.addSubview(button)
                return button.rx.tap.asObservable()
            }
            .subscribe({ _ in
    
                // Action
    
            }).disposed(by: self.disposeBag)
    

    【讨论】:

      【解决方案2】:

      我可以确认嵌套订阅是不行的。

      您可以在pipe 中使用switchMap 运算符。

      【讨论】:

      • 这被视为评论
      • @IvanKaloyanov 还提供了一个解决方案(使用switchMap),因此有资格获得答案。