ios - RxSwift 观察数组变化

标签 ios swift rx-swift rx-cocoa

假设我们有 InvoiceDataModel 数组

private let invoices Variable<[InvoiceDataModel]> = Variable([])

class InvoiceDataModel { 
    let id: Variable<Int>
    var entity: Variable<InvoiceDto>
    var isSelected: Variable<Bool> 
}

点击复选框时,我正在更改 isSelected 的值。 我想要实现的是对 isSelect 更改使用react:

  • 计算所选项目的总量(每个实体都有var amount: Double)
  • 检测集合中的所有项目是否都被选中

是否有可能观察整个数组并对元素变化的单个属性使用react? 不确定我应该如何实现这一目标。

可能我处理这个案例的方法是完全错误的。但是我不确定我应该如何以不同的方式在这里操作。

最佳答案

entityisSelected 变量需要是 let 而不是 vars。

这是我想出的解决方案:

let selectedsAndAmounts = invoices
    .asObservable()
    .flatMapLatest {
        Observable.combineLatest($0.map {
            Observable.combineLatest($0.isSelected.asObservable(), Observable.just($0.amount)) { (isSelected: $0, amount: $1) }
        })
    }

let allSelected = selectedsAndAmounts
    .map { $0.map { $0.isSelected } }
    .map { $0.contains(false) == false }

let amountOfSelected = selectedsAndAmounts
    .map { $0.map { $0.isSelected ? $0.amount : 0 } }
    .map { $0.reduce(0, +) }

此解决方案(selectedsAndAmounts observable)中的大部分复杂性来自于必须将 observables 解包在 observables 中。如果您可以稍微分解一下,或者从 InvoiceDataModel 中删除变量,那就更好了。

关于ios - RxSwift 观察数组变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51177561/

相关文章:

ios - 视频未在 iOS 5 中加载(使用无法识别的键调用)

ios - 打开从 parse.com Swift 发送的通知中的链接

ios - Truetime iOS Framework 出现超时错误

json - Alamofire CRUD POST JSON

swift - RxSwift/Moya - 如果通过函数返回序列将不会启动

ios - 设备博览会崩溃

swift - 为 Decodable 类中的属性设置更改名称 | swift

swift - 如何更改游戏中的键盘重复率?

swift - RxSwift - 数组合并、排序、删除重复项

ios - UINavigationBar 的 UIBindingObserver 无法按预期工作