RxSwift BehaviorRelay отменить предыдущие вызовы, использовать только самые последние - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть BehaviorRelay настройка для хранения массива адресов, а затем я наблюдаю, что BehaviorRelay, чтобы я мог создать массив MKAnnotation и затем отобразить его на карте.

let addresses = BehaviorRelay<[Address]>(value: [])

Я делаю сетевые запросы, когда пользователь перемещает карту в новую область.Если пользователь перемещает карту очень быстро, я могу получить несколько сетевых запросов

. Мне нужен только самый последний ответ.

Вот здесь и начинается моя проблема.

    addresses.asObservable().subscribe(onNext: { [unowned self] (value) in
        self.fetchAllAnnotationsAndAddToMap()
    }).disposed(by: disposebag)

fetchAllAnnotationsAndAddToMap вызывается при каждой установке адресов.

fetchAllAnnotationsAndAddToMap может занять много времени.Запросы на выполнение fetchAllAnnotationsAndAddToMap складываются, и все они выполняются до завершения.

То, что я хочу сделать, - это когда однажды установлен addresses, я хочу, чтобы все предыдущие вызовы были отброшены и использовать толькосамое позднее.

Я слышал, что это то, для чего flatMapLatest.

Однако, flatMapLatest требует, чтобы я вернул наблюдаемое, и меня это смущает.

Какотменить методы, вызываемые после обновления BehaviorRelay, и использовать только самые последние?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вероятно, использование flatMapLatest является определенным решением этой проблемы. Однако я хотел бы предложить другое решение:

Просто заново инициализируйте ваш BehaviorRelay снова в вашей subscribe части вашегокод и отфильтровать пустые, например:

  addresses.asObservable().filter({$0.count >0}).subscribe(onNext: { [unowned self] (value) in
    self.fetchAllAnnotationsAndAddToMap()
    self.addresses = BehaviorRelay<[Address]>(value: [])
}).disposed(by: disposebag)
0 голосов
/ 22 февраля 2019

Сначала вам нужно разбить вашу функцию fetchAllAnnotationsAndAddToMap() на две функции.Тогда вы можете:

addresses.asObservable()
    // you might want to put a `debounce` call in here.
    .flatMapLatest { addresses in 
        return fetchAllAnnotations(from: addresses)
    }
    .subscribe(onNext: { [weak self] annotations in 
        self?.addToMap(annotations)
    }
    .disposed(by: disposeBag)
...