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(...)
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.
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 onCompleted
onDisposed
).
Comme @chriswillow a déjà répondu les deuxbind
et subscribe(onNext:
abonnez-vous à un observable.