J'essaye de créer un observable à partir d'un simple Int afin que je puisse m'y abonner lors du changement, mais il n'écoute que lors du premier chargement, que me manque-t-il?
private func startObserving() { getRating().subscribe(onNext: { (rating: Int) in print("NAKO \(rating)") }) } private func getRating() -> Observable<Int> { return Observable.create{ observer in observer.on(.next(self.ratingView.rating())) observer.on(.completed) return Disposables.create() } }
3 Réponses :
// var changingValue = PublishSubject<Int>() // // let value = self.ratingView.rating() // changingValue.onNext(value) // inform observers like so // private let disposeBag = DisposeBag() changingValue.asObservable() .subscribe(onNext: { [weak self] (value) in print("NAKO \(value)") }) .disposed(by: disposeBag)
Vous devez convertir la valeur de l'évaluation en flux de valeurs, si vous utilisez onCompleted, le flux se terminera donc pas besoin d'utiliser onCompleted.
let rating = self.ratingView.rating() Observable.of(rating) .subscribe(onNext: { (value: Int) in print(value) }) .disposed(by: disposeBag)
Je pense que si vous n'avez pas accès pour modifier le code original, la seule chose que vous pouvez faire est quelque chose comme ceci:
let ratingView = YourRatingView() ratingView.rating_rx.subscribe(onNext: { rating in print(rating) }).disposed(by: disposeBag)
Regardez que j'utilise un ReplaySubject
afin que chaque fois que vous vous abonnez, vous recevez au moins la dernière valeur de notation. Ensuite, après chaque modification, vous recevrez un événement dans votre abonnement.
class YourRatingView: RatingView { private let ratingSubject: ReplaySubject<Int> override var rating: Int { get { return super.rating } set { super.rating = newValue ratingSubject.on(.next(super.rating)) } } override init(){ ratingSubject = ReplaySubject<Int>.create(bufferSize: 1) super.init() ratingSubject.on(.next(super.rating)) } var rating_rx: Observable<Int> { return ratingSubject.asObservable() } }
C'est parce que vous appelez
observer.on (.completed)
immédiatement aprèsobserver.on (.next (self.ratingView.rating ()))
et tous les abonnements à ce spécifique observable sera supprimé lorsque vous appelezobserver.on (.completed)
car vous avez clairement déclaré que cet observable est terminé en émettant des événements maintenant vous ne pouvez pas appeleronNext
plus loin onservable@SandeepBhandari J'ai supprimé le
observer.on (.completed)
mais je n'obtiens toujours pas la dernière valeurC'est parce que ce n'est pas ainsi que les observables sont conçus pour fonctionner, si vous voulez déclencher la nouvelle valeur à chaque fois, vous devrez appeler. Exemple
observer.on (.next (self.ratingView.rating ()))
chaque time ratingAfficher les changements de classement dans l'instructionObservable.create {
. Ce dont vous avez réellement besoin ici, c'est deSubject
User publishSubjectlaissez value = PublishSubject () et déclenchez le sujet chaque fois que
self.ratingView.rating () `change. Je crois que tu as mal compris comment fonctionnent les observablescar
self.ratingView.rating ()
provient d'un tiers et ne renvoie qu'une simple valeur Int, et j'essaie d'observer si la valeur int change