【问题标题】:How to ignore behaviorRelay element removal on RxSwift?如何忽略 RxSwift 上的 behaviorRelay 元素删除?
【发布时间】:2020-01-19 23:19:45
【问题描述】:

我正在观察一个 BehaviorRelay,我只想在项目数量增加时订阅。我尝试了 distinct/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.
}

【问题讨论】:

  • 如果数组中有 5 项,则删除一项,然后添加一项,这是否算数,或者您只想在数组达到 6 项时收到通知?
  • @DanielT。它肯定很重要。重点是忽略减少但从不追加。

标签: ios swift rx-swift


【解决方案1】:

首先,使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    相关资源
    最近更新 更多