对不起。我很困惑Rxswift中的绑定是什么。据我所知,除非观察者订阅了observable
,否则myObservable.subscribe(onNext: {})
不会产生价值,例如// in LoginViewModel.swift
init() {
isValid = Observable.combineLatest(username.asObservable(), password.asObservable()) { (username, password) in
return !username.isEmpty && !password.isEmpty
}
}
// in LoginViewController.swift
viewModel.isValid.bind(to: loginButton.rx.isEnabled).disposed(by: disposeBag)
。
但是当我读下面的代码时:
isValid
我很困惑,为什么subscribe
Observable能够在不调用LoginViewController.swift
方法的情况下被观察到呢?
为什么我们可以在{{1}中调用bind(to :)无需调用类似viewModel.isValid.subscribe(...)
答案 0 :(得分:13)
查看bind(to: )
public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E {
return self.subscribe(observer)
}
内部调用订阅。
关于你的陈述
据我所知,除非观察者订阅,否则观察者不会产生价值
仅适用于冷可观察对象。让我引用RxSwift docs
Observable何时开始发出其项目序列?这取决于Observable。 “热”Observable可以在创建项目后立即开始发出项目,因此任何后来订阅该Observable的观察者都可以开始在中间某处观察序列。另一方面,“冷”Observable等待观察者在它开始发射物品之前订阅它,因此这样的观察者保证从一开始就看到整个序列。
答案 1 :(得分:2)
由于我偶然发现了这个问题,试图理解两者之间的区别,因此我想为bind
添加一下:
如果在调试模式下发生错误,将引发
fatalError
。
如果在释放模式下发生错误,将记录error
。
subscribe(onNext:
的方法不同,它允许通过自定义处理方式显式处理onError:
(与onCompleted
{{ 1}})。
@chriswillow已经回答了两者 onDisposed
和bind
请订阅。