1
votes

Variable swift simple à rxswift observable

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()
    }
}


4 commentaires

C'est parce que vous appelez observer.on (.completed) immédiatement après observer.on (.next (self.ratingView.rating ())) et tous les abonnements à ce spécifique observable sera supprimé lorsque vous appelez observer.on (.completed) car vous avez clairement déclaré que cet observable est terminé en émettant des événements maintenant vous ne pouvez pas appeler onNext plus loin onservable


@SandeepBhandari J'ai supprimé le observer.on (.completed) mais je n'obtiens toujours pas la dernière valeur


C'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 observer.on (.next (self.ratingView.rating ())) chaque time ratingAfficher les changements de classement dans l'instruction Observable.create {. Ce dont vous avez réellement besoin ici, c'est de Subject User publishSubject . Exemple laissez value = PublishSubject () et déclenchez le sujet chaque fois que self.ratingView.rating () `change. Je crois que tu as mal compris comment fonctionnent les observables


car 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


3 Réponses :


1
votes
// 

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)

0 commentaires

0
votes

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)


0 commentaires

0
votes

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.

Exemple d'utilisation:

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()
    }
}


0 commentaires