web-dev-qa-db-fra.com

Liaison observable Rxswift (à :) vs abonnement (onNext :)

Pardon. Je suis confus ce qui est contraignant dans Rxswift. Pour autant que je sache, observable ne produira de valeur que si un observateur y a souscrit, par exemple myObservable.subscribe(onNext: {}).

Mais quand j'ai lu la ligne de code suivante:

// 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)

Je ne comprends pas pourquoi le isValid Observable peut être observé sans appeler une méthode subscribe dessus?
Pourquoi nous pouvons simplement appeler bind (to :) dans LoginViewController.Swift Sans appeler quelque chose comme viewModel.isValid.subscribe(...)

14
bufferoverflow76

Regardez l'implémentation de bind(to: )

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

S'abonner est appelé à l'intérieur.

Concernant votre déclaration

Pour autant que je sache, observable ne produira de valeur que si un observateur y a souscrit

Cela n'est vrai que pour les observables à froid . Permettez-moi de citer RxSwift docs

Quand un observable commence-t-il à émettre sa séquence d'éléments? Cela dépend de l'Observable. Un observable "chaud" peut commencer à émettre des éléments dès qu'il est créé, et donc tout observateur qui s'abonne plus tard à cet observable peut commencer à observer la séquence quelque part au milieu. Un observable "froid", d'autre part, attend qu'un observateur s'y abonne avant de commencer à émettre des éléments, et donc un tel observateur est garanti de voir la séquence entière depuis le début.

15
chriswillow

Depuis que je suis tombé sur cette question en essayant de comprendre la différence entre ces deux, je voudrais ajouter que pour bind:

Si une erreur se produit en mode débogage, fatalError sera levé.
Si une erreur se produit en mode de libération, error sera enregistré.

L'approche est différente pour subscribe(onNext: qui permet de explicitement gérer onError: avec une gestion personnalisée (idem pour onCompletedonDisposed).

Comme @chriswillow a déjà répondu les deuxbind et subscribe(onNext:abonnez-vous à un observable.

4
Kamil.S