2

想象一个允许编辑姓名姓氏年龄头像图像等字段的用户配置文件。当用户单击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(...)

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

4

1 回答 1

0

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

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

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

来自 RxSwift 的文档,.combineLatest()

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

于 2016-03-19T23:43:38.820 回答