0

Я новичок в использовании рамки RxSwift, я на самом деле изучаю и пытаюсь понять основы, и мне бы хотелось, чтобы какая-то помощь вам понравилась.Как использовать объект публикации для наблюдения за значением переменной?

private func observeCurrentIndex() -> Observable<Int> { 
    return Observable<Int>.create { (observer) -> Disposable in 
     observer.onNext(self.currentIndex) 
     return Disposables.create() 
    } 
    } 

Здесь я создал наблюдаемый on currentIndex, который является int. Когда я подписываюсь на него, я получаю только первое значение currentIndex, которое равно 2. Не предполагается ли мне уведомлять меня, когда изменяется текущийIndex (точно так же, как KVO)?

override func viewDidLoad() { 
    super.viewDidLoad() 
    observeCurrentIndex() 
     .subscribe(onNext: { (valeur) in 
     print("new value \(valeur)") 
     }) 
     .addDisposableTo(disposeBag) 
    } 

Чтобы получать уведомления каждый раз, когда изменяется значение currentIndex, мне сказали, что я должен использовать publishSubject для этого.

@IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex <= kMaxIndex { 
     currentIndex = currentIndex + 1 
    } 
    } 

Может ли кто-нибудь указать мне, где и как это сделать? Заранее спасибо.

ответ

2

Обычно Subject s используются для связывания императивного API с реактивным миром. Более подробную информацию о том, как использовать тему, можно найти here.

Есть пара решение для наблюдения переменной эволюции с использованием примитивов RxSwift в

Использование KVO

class WithIndex: NSObject { 
    dynamic var currentIndex: Int 

    func observeCurrentIndex() -> Observable<Int> { 
    return instance.rx.observe(Int.self, "currentIndex") 
    } 

    @IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex <= kMaxIndex { 
     currentIndex = currentIndex + 1 
    } 
    } 
} 

Недостатком этого решения является то, что WithIndex потребности наследовать от NSObject для KVO быть доступны.

Использование переменной

class WithIndex { 
    let currentIndex: Variable<Int> 

    func observeCurrentIndex() -> Observable<Int> { 
    return currentIndex.asObservable() 
    } 

    @IBAction func increaseAction(_ sender: UIButton) { 
    if currentIndex.value <= kMaxIndex { 
     currentIndex.value = currentIndex.value + 1 
    } 
    } 
} 

Это один более практичное. Затем вы можете установить значение currentIndex с использованием currentIndex.value = 12 и наблюдать за использованием currentIndex.asObservable().subscribe(...).

Variableis a simple wrapperBehaviorSubject и будет отправлять событие .next каждый раз при изменении значения переменной.

0

Я пришел из RxJS, но я думаю, что вам действительно нужен ReplaySubject.

Первый код, который вы предоставили, вы просто создаете наблюдаемое, которое возвращает только 1 значение. Код внутри Observable.create просто выполняется каждый раз, когда кто-то .subscribe() s на нем.

Публикация больше предназначена для обмена подпиской между многими подписчиками ... Идеальный случай заключается в том, что если вам нужна конкретная информация, собранная с одного сервера, которая будет использоваться во многих местах вашего приложения ... Вы не Не хотите спамить сервер с таким количеством запросов, поэтому вы просто делаете один запрос, публикуете это, и наблюдатели будут подписываться на этот опубликованный поток.

ReplaySubject (или BehaviourSubject, но тогда вам нужно знать начальное значение при его инициализации) больше в строке того, что вы хотите: это Observable и Observer, объект, где другие наблюдатели могут подписаться на , и каждый раз, когда вы вызываете .onNext(), все подписчики получат новое значение.

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

Смежные вопросы