2

Представьте профиль пользователя, который позволяет редактировать полей как имя, фамилии, возраст и avatarImage. Когда пользователь нажимает Save, запросы отправляются для каждого измененного значения.RxSwift: Zip Наблюдаемые только если требования будут выполнены

Теперь подумайте о функциях с подписями, как те:

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

Вы говорите, что когда вы удаляете спасение, у вас есть три поля, каждое из которых генерирует одно значение? – Enigmativity

+0

Когда сбой ударил, я хочу предварительно выбрать запросы, которые должны быть сделаны, на основе проверок, изменились ли имя, фамилия или возраст. –

+0

Это не то, что я спросил. Я хотел знать, если, когда вы нажмете, у вас есть три наблюдаемых, каждый из которых производит одно значение? – Enigmativity

ответ

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():

Сливает указанные наблюдаемые последовательности в одной наблюдаемой последовательности с помощью функции селектора всякий раз, когда какой-либо из наблюдаемых последовательностей производит элемент.

+0

Итак, вы предлагаете проверить, нужен ли запрос в соответствии с соответствующим наблюдаемым? –

+0

Хм, не уверен, что я полностью понял ваш вопрос. Подумайте об этом таким образом, представьте, что ваши 3 запроса - 3 наблюдаемых потока. Каждый поток будет испускать элемент всякий раз, когда изменяется значение ответа. Поэтому всякий раз, когда какой-либо из этих трех потоков испускает элемент, 'combLatest()' - сам наблюдаемый - выдает элемент, содержащий все 3 элемента из 3 потоков. –

+0

Это зависит от вас, чтобы изменить значение запроса, является ли это 1 или 3 из них ... комбинированный наблюдаемый просто объединяет новые ответы со старыми ответами из других потоков, а затем испускает. –