Как игнорировать удаление элемента поведенияRelay на RxSwift? - PullRequest
1 голос
/ 20 января 2020

Я наблюдаю за BehaviorRelay и хочу подписаться только тогда, когда количество элементов увеличивается. Я попытался Different / dinstinctUntilChanged , но он не подходит моим потребностям, потому что он пропустит слишком много или слишком мало раз.

behaviorRelay
  .compactMap { $0?.items }
  .subscribe(onNext: { elements in
      print("items has one more element.")
  }).disposed(by: bag)

var behaviorRelay = BehaviorRelay<[Car]?>(value: [])

class Car {
  var items: [Any] // whatever... just an example.
}

1 Ответ

3 голосов
/ 20 января 2020

Прежде всего, используйте map для сопоставления массива с числом (элементов):

.map { $0?.count ?? 0 } // return 0 if array is nil

Чем используйте scan, чтобы извлечь текущий и предыдущий элементы, например:

.scan((0, 0)) { previousPairOfValues, newValue in
    return (previousPairOfValues.1, newValue) // create new pair from newValue and second item of previous pair
}

Затем используйте filter, чтобы передать только растущие значения:

.filter { $0.1 > $0.0 } // newer value greater than older value

Затем сопоставьте его с последним значением:

.map { $0.1 }

Соедините все вместе:

behaviorRelay
  .compactMap { $0?.items }
  .map { $0?.count ?? 0 } // return 0 if array is nil
  .scan((0, 0)) { previousPairOfValues, newValue in
    return (previousPairOfValues.1, newValue) // create new pair from newValue and second item of previous pair
  }
  .filter { $0.1 > $0.0 } // newer value greater than older value
  .map { $0.1 }
  .subscribe(onNext: { elementCount in
      print("items has one more element.")
      print("there are \(elementCount) items now")
  }).disposed(by: bag)
...