RxSwift:仅在满足要求时才使用Zip Observable

时间:2016-02-08 11:04:20

标签: swift reactive-programming reactive-cocoa rx-swift reactivex

想象一下用户个人资料,它允许编辑姓名姓氏年龄 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(...)

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

1 个答案:

答案 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()

  

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