Сбор свойства хранимой переменной с помощью withLatestFrom - PullRequest
0 голосов
/ 20 мая 2019

Мне интересно, есть ли способ в RxSwift наблюдать значение свойства хранимой переменной.Например.в следующем примере:

    var updatedValue: Int = 0

    var observedValue: Observable<Int> {
            return Observable.create({ (observer) -> Disposable in
                observer.onNext(updatedValue)
                return Disposables.create()
            })
        }

    Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
        updatedValue = updatedValue + 1;
    }

    let myObservable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        .publish()

    myObservable.connect()

    myObservable
        .withLatestFrom(observedValue)
        .subscribe { (event) in
            print(event)
    }

У нас есть свойство переменной updatedValue и горячая наблюдаемая myObservable .Мы также увеличиваем значение updatedValue в Timer.scheduledTimer ... .

Поток здесь довольно прямой.Когда мы подписываемся, вызывается наблюдаемое значение, мы получаем onNext из наблюдаемого значения и затем Disposables.create ().Затем мы печатаем событие onNext (0).

Поскольку myObservable основано на Observable.interval , то же значение withLatestFrom печатается в onNext каждую секунду.

Вопрос: есть ли способ напечатать последнее значение updatedValue каждый раз, когда myObservable отправляет новое событие?Таким образом, вместо 0,0,0 ... мы получаем 0,1,2 ...

Я знаю, что updatedValue может быть объявлено как BehaviorRelay.Я также знаю, что мы могли бы использовать .map {} для захвата self.updatedValue.

Но мне интересно, есть ли способ создать оболочку Observable вокруг стандартного свойства переменной, чтобы он вызывал onNext с большинствомпоследнее значение каждый раз, когда триггерная последовательность отправляет событие?Без захвата себя или изменения объявления на updatedValue.

Спасибо за любые комментарии и идеи!

Ответы [ 2 ]

1 голос
/ 21 мая 2019

RxCocoa имеет удобную обертку вокруг КВО. Вы должны иметь возможность использовать его из расширения .rx на подклассах NSObject.

Для вашей проблемы, я думаю, вы можете сделать что-то вроде:

let updatedValueObservable = self.rx.observe(Int.self, "updatedValue")
1 голос
/ 21 мая 2019

Но мне интересно, есть ли способ создать оболочку Observable вокруг стандартного свойства переменной, чтобы он вызывал onNext с самым последним значением каждый раз, когда последовательность триггера отправляет событие? Без захвата себя или изменения объявления на updatedValue.

Правильный ответ: нет. Нет никакого способа сделать что-либо с updatedValue без участия самого себя. Один из способов сделать это был бы с Observable<Int>.interval(1, scheduler: MainScheduler.instance).compactMap { [weak self] _ in self?.updatedValue }.distinctUntilChanged() (использование вами публикации и подключения странно и ненужно), но это включает себя.

Поскольку ваше свойство является типом значения, единственный способ получить к нему доступ через self, даже если Rx вообще не был задействован.

...