RxSwift:仅在满足要求时才压缩 Observables
Posted
技术标签:
【中文标题】RxSwift:仅在满足要求时才压缩 Observables【英文标题】:RxSwift: Zip Observables only if requirements are met 【发布时间】:2016-02-08 11:04:20 【问题描述】:想象一个用户配置文件,它允许编辑 name、surname、age 和 avatarImage 等字段。当用户单击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:批量更新插入,但仅在满足某些条件时才更新记录