msc*_*her 6 system.reactive rx-swift
我正在探索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)
}
}
Run Code Online (Sandbox Code Playgroud)
这里的问题是我正在使用PublishSubject将更新推送到输入流,这是必要的并且建议不要使用.Rx是否提供了以某种方式将序列添加到已运行的observable的方法?
经过一番研究,答案似乎是否定的。很简单,因为如果您想将序列添加到已经运行的可观察对象中,那么它就是一个突变。并且没有声明性的方法来进行突变。
我查看了一个名为 Cycle.js 的 javascript 库,它执行完全相同的操作,并且他们使用 ReplaySubject 以类似的方式解决了这个问题。
你唯一能做的就是让它看起来更好一点
button.rx_tap
.subscribe(input)
Run Code Online (Sandbox Code Playgroud)
代替
button.rx_tap
.subscribeNext {
input.onNext($0)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |