简体   繁体   中英

Simple swift variable to rxswift observable

Im trying to create an observable from a simple Int so I can subscribe to it upon changing, but it only listens on the first load, what am I missing?

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

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)

You need convert the rating value into stream of values, if you use onCompleted the stream will complete so no need to use onCompleted.

let rating = self.ratingView.rating()
Observable.of(rating)
    .subscribe(onNext: { (value: Int) in
        print(value)
    })
    .disposed(by: disposeBag)

I think that if you don't have access to modify the original code, the only thing you can do is something like this:

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

Look that I'm using a ReplaySubject so each time you subscribe you receive at least the last value of rating. Then after each change you will receive an event in your subscription.

Example of using it:

let ratingView = YourRatingView()

ratingView.rating_rx.subscribe(onNext: { rating in
    print(rating)
}).disposed(by: disposeBag)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM