System.reactive 有没有一种方法可以在定义一个可观察对象之后,以声明方式将更新推送到该对象?

System.reactive 有没有一种方法可以在定义一个可观察对象之后,以声明方式将更新推送到该对象?,system.reactive,rx-swift,System.reactive,Rx Swift,我正在探索Rx,我想看看是否可以在初始化某个UI元素的组件之前,以声明的方式定义该元素的输入和输出 这就是它的样子: class ViewController: UIViewController { @IBOutlet weak var button: UIButton! var child: ButtonComponent! override func viewDidLoad() { super.viewDidLoad() let

我正在探索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)
    }
}
类ViewController:UIViewController{
@IBVAR按钮:UIButton!
变量子项:ButtonComponent!
重写func viewDidLoad(){
super.viewDidLoad()
let buttonInput=PublishSubject()
let buttonOutput=buttonInput
.scan(0){count,{in
计数+1
}
.map{$0.description}
self.child=按钮组件(
按钮:self.button,
输入:按钮输入,
输出:按钮输出
)
}
}
类按钮组件{
弱var按钮:UIButton!
设disposeBag=disposeBag()
初始化(按钮:UIButton,输入:PublishSubject,输出:Observable){
self.button=按钮
输出
.subscribeNext{string in
button.setTitle(字符串,forState:.Normal)
}
.addDisposableTo(disposeBag)
按钮.rx_抽头
.subscribeNext{
input.onNext($0)
}
.addDisposableTo(disposeBag)
}
}

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

经过一些研究,答案似乎是否定的。因为如果你想将序列添加到已经运行的可观察对象,这是一种突变。而且没有声明性的方式来进行突变

我看了一个名为cycle.js的javascript库,它做了完全相同的事情,他们用一个ReplaySubject以类似的方式解决了这个问题

你唯一能做的就是让它看起来更漂亮一点

button.rx_tap
    .subscribe(input)
而不是

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

最后一个问题的答案是肯定的,使用
Observable.Merge
。虽然我不太确定如何在这里应用它…这不是真的。
merge
操作符将允许您添加到已经运行的可观察对象。
merge
返回一个新的可观察对象,它不能改变可观察对象。是的,但是如果您在编译时将合并插入查询,那么您可以在运行时插入值。但是要合并的两个序列必须已经存在。这里的问题是,在我输入按钮之前,我想用
按钮输入
来定义
按钮输出