我非常关心如何管理对象属性的更改。
假设我有一个“汽车”类,其中包含一些属性,例如“名称”、“日期”、“价格”等。
在我的视图“A”中,我正在显示从 API 检索的所有汽车。在视图 B 和 C 中,我可以显示和编辑有关视图 A 中所选汽车的特定信息(假设它是“汽车 AAA”)。也可以通过 API 调用刷新汽车对象以检索有关汽车的最新信息。
如果用户在另一个视图中的对象汽车上执行某些操作,我希望能够更新视图 A。或者,如果用户“刷新”汽车对象以确保拥有有关该汽车的最新数据。但是,如果用户只是更改了汽车的名称,我不想为此刷新视图 A 中的所有 UI。我想知道只是名称已更改。
在视图 A 中获取该车的任何更新的最佳方式是什么?我是否必须有一个类来管理汽车的所有属性作为“PublishRelay”或“PublishSubject”,并在我的完整应用程序中使用它?
我非常关心如何管理对象属性的更改。
请记住,ReactiveX 是功能性的范例。物体的属性不会改变。相反,从 Observable 发出一个具有不同属性的新对象。
如果您只对跟踪特定汽车的名称感兴趣,那么这是一个简单的映射:
extension ObservableType where E == [Car] {
func nameOfCar(withID id: Int) -> Observable<String?> {
return map { $0.first(where: { $0.id == id }) }
.map { $0?.name }
.distinctUntilChanged()
}
}
因为distinctUntilChanged()
运算符,只有当输入 ID 的汽车名称发生变化时,上面的代码才会发出一个值。选项的存在使得消费者可以检测到汽车是否不再在阵列中。从技术上讲,该运算符观察发出汽车数组的 Stream,映射发出的每个数组,以查看具有正确 ID 的汽车是否存在,如果存在,则找到该汽车的名称。然后,它将该名称与之前发出的名称进行比较,仅当名称不同时才发出该名称。
您可以通过以下方式更普遍地观察 Car 对象:
extension ObservableType where E == Car {
var name: Observable<String> {
return map { $0.name }
.distinctUntilChanged()
}
var price: Observable<Double> {
return map { $0.price }
.distinctUntilChanged()
}
// etc...
}
extension ObservableType where E == [Car] {
func car(withID id: Int) -> Observable<Car?> {
return map { $0.first(where: { $0.id == id }) }
.distinctUntilChanged() // assumes a Car is Equatable
}
}
我预计可以使用 Swift 的新键路径系统制定更通用的解决方案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)