假设我们有一个类Dog
class Dog {
let age = BehaviorRelay<Int>(value: 1)
}
在某个地方,我们有一个阵列属性,里面有所有的狗
let dogs = BehaviorRelay<[Dog]>(value: [..., ...])
现在我想创建一个UI,它需要UITableView中列出的狗的数组,并且它想在每个狗的年龄变化时更新(调用引擎盖下的reloadDate)?
所以当我简单地订阅时:
dogs.subscribe(onNext: {
print("($0)")
})
当新的狗进入阵列,或者一些狗离开阵列时,订阅将被解雇,但当狗成熟时,订阅不会被解雇,即:
dogs.value[1].age.accept(2)
我知道flatMap和flatMapLatest,但他们似乎希望Dogs是一个普通类型,而不是数组。我是RxSwift的新手,任何帮助都将不胜感激!
因此,当您有如上所述的设置时,表视图本身将绑定到dogs
可观察。。。dogs.bind(to: tableView.rx.items...
然后在闭包内,您将使细胞与可观察到的age
结合,以显示当前年龄。有了所有这些,如果更新特定狗的年龄,单元将自动更新,而不必重新加载整个表View。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]的单元格将监听dog的年龄,如果您调用dogs.value[1].age.accept(2)
,该单元格将注意到变化并自行更新。