RxSwift:管理应用程序中的对象更新

2024-04-22

我非常关心如何管理对象属性的更改。

假设我有一个“汽车”类,其中包含一些属性,例如“名称”、“日期”、“价格”等。

在我的视图“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(使用前将#替换为@)

RxSwift:管理应用程序中的对象更新 的相关文章

随机推荐