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

buf*_*w76 17 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)
Run Code Online (Sandbox Code Playgroud)

我很困惑,为什么isValidObservable能够在不调用subscribe方法的情况下被观察到?
为什么我们可以调用bind(to :) in LoginViewController.swift而不调用类似的东西viewModel.isValid.subscribe(...)

chr*_*low 18

看看执行情况 bind(to: )

public func bind<O: ObserverType>(to observer: O) -> Disposable where O.E == E {
    return self.subscribe(observer)
}
Run Code Online (Sandbox Code Playgroud)

订阅在里面调用.

关于你的陈述

据我所知,除非观察者订阅,否则观察不会产生价值

这仅适用于寒冷的观察者.让我引用这个网站

Observable何时开始发出其物品序列?这取决于Observable."热"Observable可以在创建项目后立即开始发出项目,因此任何后来订阅该Observable的观察者都可以开始在中间某处观察序列.另一方面,"冷"Observable等待观察者在开始发射物品之前订阅它,因此这样的观察者保证从一开始就看到整个序列.


Kam*_*l.S 6

由于我偶然发现了这个问题,试图了解这两者之间的区别,因此我想补充一点bind

如果在调试模式下发生错误,fatalError将引发。
如果在发布模式下发生错误,error将被记录。

该方法是不同subscribe(onNext:,它允许明确处理onError:自定义处理(同为onCompleted onDisposed)。

因为@chriswillow 已经回答了这两个问题 bind并且subscribe(onNext: 订阅了一个 observable。