有没有办法在定义后以声明方式将更新推送到可观察对象?
Is there a way to declaratively push updates to an observable after it has been defined?
我正在探索 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 { [=10=].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([=10=])
}
.addDisposableTo(disposeBag)
}
}
这里的问题是我正在使用 PublishSubject 将更新推送到输入流,这是必要的并且建议不要这样做。 Rx 是否提供了一种方法来以某种方式将序列添加到已经 运行 的可观察对象中?
经过一番研究,答案似乎是否定的。仅仅是因为如果你想向已经 运行 的可观察对象添加一个序列,这是一个突变。并且没有声明性的方式来进行突变。
我查看了一个名为 cycle.js 的 javascript 库,它做的事情完全相同,他们以类似的方式解决了它,使用 ReplaySubject。
你唯一能做的就是通过
让它看起来更漂亮一点
button.rx_tap
.subscribe(input)
而不是
button.rx_tap
.subscribeNext {
input.onNext([=11=])
}
我正在探索 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 { [=10=].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([=10=])
}
.addDisposableTo(disposeBag)
}
}
这里的问题是我正在使用 PublishSubject 将更新推送到输入流,这是必要的并且建议不要这样做。 Rx 是否提供了一种方法来以某种方式将序列添加到已经 运行 的可观察对象中?
经过一番研究,答案似乎是否定的。仅仅是因为如果你想向已经 运行 的可观察对象添加一个序列,这是一个突变。并且没有声明性的方式来进行突变。
我查看了一个名为 cycle.js 的 javascript 库,它做的事情完全相同,他们以类似的方式解决了它,使用 ReplaySubject。
你唯一能做的就是通过
让它看起来更漂亮一点button.rx_tap
.subscribe(input)
而不是
button.rx_tap
.subscribeNext {
input.onNext([=11=])
}