我正在探索Rx,我想看看是否可以在初始化该元素的组件之前以声明的方式彼此定义一些UI元素的输入和输出。

看起来像这样:

class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!

    var child: ButtonComponent!

    override func viewDidLoad() {
        super.viewDidLoad()

        let buttonInput = PublishSubject<()>()
        let buttonOutput = buttonInput
            .scan(0) { count, _ in
                count + 1
            }
            .map { $0.description }

        self.child = ButtonComponent(
            button: self.button,
            input: buttonInput,
            output: buttonOutput
        )
    }
}

class ButtonComponent {
    weak var button: UIButton!
    let disposeBag = DisposeBag()

    init(button: UIButton, input: PublishSubject<()>, output: Observable<String>) {
        self.button = button

        output
            .subscribeNext { string in
                button.setTitle(string, forState: .Normal)
            }
            .addDisposableTo(disposeBag)

        button.rx_tap
            .subscribeNext {
                input.onNext($0)
            }
            .addDisposableTo(disposeBag)
    }
}

这里的问题是我正在使用PublishSubject将更新推送到输入流,这是当务之急,建议不要这样做。 Rx是否提供一种以某种方式将序列添加到已经运行的可观察对象的方法?

最佳答案

经过一些研究,答案似乎是否定的。仅仅因为如果您想向已经运行的可观察序列添加序列,那是一个突变。而且没有声明的方式可以进行突变。

我看了一个名为cycle.js的javascript库,该库的功能完全相同,并且使用ReplaySubject以相似的方式解决了它。

您唯一可以做的就是通过做使其看起来更好

button.rx_tap
    .subscribe(input)

代替
button.rx_tap
    .subscribeNext {
        input.onNext($0)
    }

10-07 13:14