RxSwift :管理应用程序中的对象更新
RxSwift : manage object updates in the app
我非常关心如何管理对象属性更改。
假设我有一个 "car" class,具有 "name"、"date"、"price" 等一些属性
在我看来 "A",我正在显示我从 API 取回的所有汽车。在视图 B 和 C 中,我可以显示和编辑有关在视图 A 中选择的汽车的特定信息(假设它是 "car AAA")。也可以使用 API 调用来刷新汽车对象以检索有关汽车的最新信息。
我希望能够更新视图 A,如果用户在另一个视图中对对象 car 执行某些操作。或者,如果用户 "refreshed" 汽车对象肯定有关于这辆车的最后数据。但是,如果用户只是更改了汽车的名称,我不想为此刷新视图 A 中的所有 UI。我想知道只是名称已更改。
在视图 A 中捕捉这辆车的任何更新的最佳方式是什么?我是否必须有一个 class 来管理汽车的所有属性,如 "PublishRelay" 或 "PublishSubject",并在我的完整应用程序中使用它?
I have a big concern about how to manage object properties changes.
请记住,ReactiveX 是一种功能性 范式。对象的属性不会改变。而是从具有不同属性的 Observable 发出一个新对象。
如果您只对跟踪特定汽车的名称感兴趣,那么这是一个简单的映射:
extension ObservableType where E == [Car] {
func nameOfCar(withID id: Int) -> Observable<String?> {
return map { [=10=].first(where: { [=10=].id == id }) }
.map { [=10=]?.name }
.distinctUntilChanged()
}
}
由于 distinctUntilChanged()
运算符,如果具有输入 ID 名称的汽车发生变化,以上内容只会发出一个值。可选的在那里,因此消费者可以检测汽车是否不再在阵列中。从技术上讲,此运算符观察发出汽车数组的 Stream,映射发出的每个数组以查看是否存在具有正确 ID 的汽车,如果存在,则找到该汽车的名称。然后它将该名称与它发出的先前名称进行比较,并且仅当名称不同时才发出该名称。
你可以用这个更普遍地观察汽车对象:
extension ObservableType where E == Car {
var name: Observable<String> {
return map { [=11=].name }
.distinctUntilChanged()
}
var price: Observable<Double> {
return map { [=11=].price }
.distinctUntilChanged()
}
// etc...
}
extension ObservableType where E == [Car] {
func car(withID id: Int) -> Observable<Car?> {
return map { [=11=].first(where: { [=11=].id == id }) }
.distinctUntilChanged() // assumes a Car is Equatable
}
}
我希望 Swift 的新键路径系统可以提供更通用的解决方案。
我非常关心如何管理对象属性更改。
假设我有一个 "car" class,具有 "name"、"date"、"price" 等一些属性
在我看来 "A",我正在显示我从 API 取回的所有汽车。在视图 B 和 C 中,我可以显示和编辑有关在视图 A 中选择的汽车的特定信息(假设它是 "car AAA")。也可以使用 API 调用来刷新汽车对象以检索有关汽车的最新信息。
我希望能够更新视图 A,如果用户在另一个视图中对对象 car 执行某些操作。或者,如果用户 "refreshed" 汽车对象肯定有关于这辆车的最后数据。但是,如果用户只是更改了汽车的名称,我不想为此刷新视图 A 中的所有 UI。我想知道只是名称已更改。
在视图 A 中捕捉这辆车的任何更新的最佳方式是什么?我是否必须有一个 class 来管理汽车的所有属性,如 "PublishRelay" 或 "PublishSubject",并在我的完整应用程序中使用它?
I have a big concern about how to manage object properties changes.
请记住,ReactiveX 是一种功能性 范式。对象的属性不会改变。而是从具有不同属性的 Observable 发出一个新对象。
如果您只对跟踪特定汽车的名称感兴趣,那么这是一个简单的映射:
extension ObservableType where E == [Car] {
func nameOfCar(withID id: Int) -> Observable<String?> {
return map { [=10=].first(where: { [=10=].id == id }) }
.map { [=10=]?.name }
.distinctUntilChanged()
}
}
由于 distinctUntilChanged()
运算符,如果具有输入 ID 名称的汽车发生变化,以上内容只会发出一个值。可选的在那里,因此消费者可以检测汽车是否不再在阵列中。从技术上讲,此运算符观察发出汽车数组的 Stream,映射发出的每个数组以查看是否存在具有正确 ID 的汽车,如果存在,则找到该汽车的名称。然后它将该名称与它发出的先前名称进行比较,并且仅当名称不同时才发出该名称。
你可以用这个更普遍地观察汽车对象:
extension ObservableType where E == Car {
var name: Observable<String> {
return map { [=11=].name }
.distinctUntilChanged()
}
var price: Observable<Double> {
return map { [=11=].price }
.distinctUntilChanged()
}
// etc...
}
extension ObservableType where E == [Car] {
func car(withID id: Int) -> Observable<Car?> {
return map { [=11=].first(where: { [=11=].id == id }) }
.distinctUntilChanged() // assumes a Car is Equatable
}
}
我希望 Swift 的新键路径系统可以提供更通用的解决方案。