Rxswift наблюдаемое связывание (to :) vs subscribe (onNext :)

Сожалею. Я смущен тем, что является обязательным в 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 Observable можно наблюдать без вызова метода subscribe на него?
Почему мы можем просто вызвать bind (to :) в LoginViewController.swift не вызывая что-то вроде viewModel.isValid.subscribe(...)

Ответ 1

Посмотрите на реализацию bind(to: )

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

Подписка называется внутри.

По поводу вашего заявления

Насколько я знаю, наблюдаемое не будет давать значения, если на него не подпишется наблюдатель.

Это верно только для холодных наблюдаемых. Позвольте мне процитировать из документов RxSwift

Когда Observable начинает испускать свою последовательность предметов? Это зависит от наблюдаемого. "Горячая" наблюдаемая может начать испускать предметы, как только она будет создана, и поэтому любой наблюдатель, который позже присоединится к этой наблюдаемой, может начать наблюдать последовательность где-то посередине. "Холодная" наблюдаемая, с другой стороны, ждет, пока наблюдатель не подпишется на нее, прежде чем она начнет испускать предметы, и поэтому такой наблюдатель гарантированно увидит всю последовательность с самого начала.

Ответ 2

Поскольку я наткнулся на этот вопрос, пытаясь понять разницу между этими двумя, я хотел бы добавить это для bind:

В случае возникновения ошибки в режиме fatalError будет fatalError.
В случае возникновения ошибки в режиме выпуска error будет записана в журнал.

Подход отличается для subscribe(onNext: позволяет явно обрабатывать onError: с пользовательской обработкой (то же самое для onCompleted onDisposed).

Как @chriswillow уже ответили оба bind и subscribe(onNext: сделать подписку на наблюдаемую.