【问题标题】:RxSwift : manage object updates in the appRxSwift:管理应用程序中的对象更新
【发布时间】:2018-09-14 13:06:07
【问题描述】:

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

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

在我的视图“A”中,我显示了我从 API 检索到的所有汽车。在视图 B 和 C 中,我可以显示和编辑视图 A 中所选汽车的特定信息(假设它是“汽车 AAA”)。也可以使用 API 调用刷新汽车对象,以检索有关汽车的最后信息。

如果用户在另一个视图中对对象汽车执行某些操作,我希望能够更新视图 A。或者,如果用户“刷新”了汽车对象以确保拥有关于这辆车的最新数据。但是如果用户只是更改了汽车的名称,我不想仅仅为此刷新视图 A 中的所有 UI。我想知道只是名称已更改。

在视图 A 中捕捉这辆车的任何更新的最佳方式是什么?我是否必须有一个类来管理汽车的所有属性作为“PublishRelay”或“PublishSubject”,并在我的完整应用程序中使用它?

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。
  • 实际上是一个问题...第二个“问题”只是第一个问题的想法/备注。
  • @deveLost 你有这个解决方案的工作演示吗?我也在为我的应用寻找同样的东西。

标签: swift reactive-programming rx-swift


【解决方案1】:

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

请记住,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 名称的汽车发生变化时发出一个值。选项在那里,因此消费者可以检测汽车是否不再在阵列中。从技术上讲,这个操作符观察一个发出汽车数组的流,映射每个发出的数组以查看是否存在具有正确 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 的新密钥路径系统可以提供更通用的解决方案。

【讨论】:

  • 对不起丹尼尔,谢谢你的回答!我没有看到你的回答通知,很抱歉之前没有回答。
猜你喜欢
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多