想象一下用户个人资料,它允许编辑姓名,姓氏,年龄和 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(...)
当我只想执行更改值的请求时,我该怎么办?
答案 0 :(得分:0)
你试过.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()
:
当任何可观察序列产生元素时,通过使用选择器函数将指定的可观察序列合并为一个可观察序列。