RxSwift:仅在满足要求时才压缩 Observables

Posted

技术标签:

【中文标题】RxSwift:仅在满足要求时才压缩 Observables【英文标题】:RxSwift: Zip Observables only if requirements are met 【发布时间】:2016-02-08 11:04:20 【问题描述】:

想象一个用户配置文件,它允许编辑 namesurnameageavatarImage 等字段。当用户单击Save 时,会针对已更改的每个值发送请求。

现在请考虑带有类似签名的函数:

func rx_updateUserName(name: String) -> Observable<UpdateUserNameResponse>
func rx_updateSurname(surname: String) -> Observable<UpdateSurnameResponse>
func rx_updateAge(age: Int) -> Observable<UpdateAgeResponse>

通常我们只会zip这样的请求:

let nameReqObservable = rx_updateUserName("Gandalf")
let surnameReqObservable = rx_updateSurname("The White")
let ageReqObservable = rx_updateAge(123)

let zippedRequests = Observable.zip(nameReqObservable, surnameReqObservable, ageReqObservable, 
    resultSelector:  (userNameResponse, surnameResponse, areResponse) in

    return (userNameResponse, surnameResponse, areResponse)
).subscribeNext(...)

当我只想对已更改的值执行请求时该怎么办?

【问题讨论】:

你是说当保存时你有三个字段,每个字段生成一个值? 点击保存时,我想根据检查姓名、姓氏或年龄是否已更改,预先选择必须发出的请求。 这不是我问的。我想知道当你点击保存时,你是否有 3 个 observable,每个都产生一个值? 每一个都有自己的价值,是的。 这有点奇怪。为什么不只拥有一个同时产生所有三个值的 observable 并避免你正在做的所有压缩?毕竟,它是基于点击保存按钮的单个事件。 【参考方案1】:

你试过.combineLatest()吗? 可视化在这里 - http://rxmarbles.com/#combineLatest 在您的情况下,每当输入 observable 中的一个值发生更改时,combinedRequests observable 将发出一组新的输入。

let combinedRequests = Observable.combineLatest(nameReqObservable, surnameReqObservable, ageReqObservable, 
    resultSelector:  (userNameResponse, surnameResponse, ageResponse) in

    return (userNameResponse, surnameResponse, ageResponse)
).subscribeNext(...)

来自 RxSwift 的文档,.combineLatest():

只要任何可观察序列产生一个元素,就使用选择器函数将指定的可观察序列合并为一个可观察序列。

【讨论】:

那么您是否建议在相应的 observable 本身中检查请求是否必要? 嗯,不确定我是否完全理解您的问题。这样想,想象你的 3 个请求是 3 个可观察的流。每当响应值更改时,每个流都会发出一个元素。因此,每当这 3 个流中的任何一个发出一个元素时,combineLatest()(一个可观察对象本身)都会发出一个包含来自 3 个流的所有 3 个元素的元素。 无论是 1 个还是 3 个请求,由您决定更改值的请求...组合的 observable 只是将新响应与来自其他流的旧响应组合起来,然后发出。 这似乎不是我的问题的解决方案,因为我需要找到一种方法来轻松地预选和组合剩余的请求。

以上是关于RxSwift:仅在满足要求时才压缩 Observables的主要内容,如果未能解决你的问题,请参考以下文章

仅在满足某些条件时才调用 Safari Content Blocker 扩展?

如何编写查询以仅在满足条件时才显示值?

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

仅在Google Apps脚本中是新文件时才解压缩文件

我一直在尝试使用 logrotate 实用程序并将压缩日志移动到 s3,但是,它仅在强制完成时才会旋转

等待多个可观察请求完成使用 RXSwift