Простая быстрая переменная для наблюдаемого rxswift - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь создать наблюдаемое из простого Int, чтобы я мог подписаться на него после изменения, но он прослушивает только при первой загрузке, что мне не хватает?

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 ]

0 голосов
/ 30 апреля 2019

Необходимо преобразовать значение рейтинга в поток значений, если вы используете onCompleted, поток завершится, поэтому нет необходимости использовать onCompleted.

let rating = self.ratingView.rating()
Observable.of(rating)
    .subscribe(onNext: { (value: Int) in
        print(value)
    })
    .disposed(by: disposeBag)
0 голосов
/ 02 мая 2019

Я думаю, что если у вас нет доступа для изменения исходного кода, единственное, что вы можете сделать, это что-то вроде этого:

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

Посмотрите, что я использую ReplaySubject, таккаждый раз, когда вы подписываетесь, вы получаете как минимум последнее значение рейтинга.Затем после каждого изменения вы получите событие в вашей подписке.

Пример использования:

let ratingView = YourRatingView()

ratingView.rating_rx.subscribe(onNext: { rating in
    print(rating)
}).disposed(by: disposeBag)
0 голосов
/ 30 апреля 2019
// 

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