Rxswift observable bind(to :) vs subscribe(onNext :)

时间:2018-01-28 09:56:20

标签: swift rx-swift

对不起。我很困惑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(...)

的内容

2 个答案:

答案 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已经回答了两者 onDisposedbind 请订阅