有没有一种方法可以在定义了可观察对象后,以声明方式将更新推送到可观察对象



我正在探索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)
    }

相关内容

  • 没有找到相关文章

最新更新