【问题标题】:RxSwift: how to subscribe to change of an array element member change?RxSwift:如何订阅数组元素成员更改的更改?
【发布时间】:2021-12-05 15:27:09
【问题描述】:

假设我们有一个类 Dog

class Dog {
    let age = BehaviorRelay<Int>(value: 1)
}

在某个地方我们有一个包含所有狗的数组属性

let dogs = BehaviorRelay<[Dog]>(value: [..., ...])

现在我想创建需要在 UITableView 中列出的狗数组的 UI,并且当每只狗的年龄发生变化时,它想要更新(在后台调用 reloadDate)?

所以当我像这样订阅时:

dogs.subscribe(onNext: {
    print("\($0)")
})

订阅会在新狗来数组时被触发,或者有些离开数组时会被触发,但不会在狗成熟时被触发,即:

dogs.value[1].age.accept(2)

我知道 flatMap 和 flatMapLatest,但他们似乎希望 Dogs 是普通类型,而不是数组。我是 RxSwift 的新手,任何帮助将不胜感激!

【问题讨论】:

  • 我不喜欢有如此多的行为中继,但我将把它放在一边并回答这个问题......
  • @DanielT。我想说,如果你以真正的函数式方式编写——你基本上根本不需要它们,但如果 50% 的代码仍然是命令式的——你经常需要 .value

标签: swift rx-swift rx-cocoa


【解决方案1】:

因此,当您进行上述设置时,表格视图本身将绑定到 dogs 可观察对象...dogs.bind(to: tableView.rx.items... 然后在闭包内,您将单元格绑定到 age 可观察对象显示当前年龄。完成所有这些后,如果您更新特定狗的年龄,单元格将自动更新 ,而无需重新加载整个 tableView。 tableView 将重新加载的唯一时间是添加新狗或从数组中删除狗。您甚至可以通过包含自定义数据源(或通过使用 RxDataSources 库)仅加载/卸载添加/删除的狗来将这种行为限制为仅添加/删除的狗。

作为参考,这里有一些示例代码:

class Dog {
    let age = BehaviorRelay<Int>(value: 1)
}

class DogController: UIViewController {
    @IBOutlet var tableView: UITableView!
    let dogs = BehaviorRelay<[Dog]>(value: [])
    let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()
        dogs
            .bind(to: tableView.rx.items(cellIdentifier: "Cell", cellType: DogCell.self)) { _, dog, cell in
                cell.configure(dog: dog)
            }
            .disposed(by: disposeBag)
    }
}

class DogCell: UITableViewCell {
    @IBOutlet var ageLabel: UILabel!
    var disposeBag = DisposeBag()
    override func prepareForReuse() {
        super.prepareForReuse()
        disposeBag = DisposeBag()
    }
    func configure(dog: Dog) {
        dog.age
            .map { "\($0) years old" }
            .bind(to: ageLabel.rx.text)
            .disposed(by: disposeBag)
    }
}

通过上述方式,显示 dog[1] 的单元格将监听狗的年龄,如果您致电 dogs.value[1].age.accept(2),该单元格将注意到更改并自行更新。

【讨论】:

  • 天哪……就这么简单!非常感谢您的宝贵时间,这绝对比重新加载整个 tableView 的解决方案更优雅、更高效。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-19
  • 2018-02-21
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多