Чтобы понять это, задайте себе вопрос: «Какие входные данные мне нужны для создания этого выходного сигнала?»
У вас есть два выхода: «Пользователь» и «Ошибка».Давайте сначала сделаем счастливый путь.Какие входные данные вам нужны для создания пользователя?Просто успешный сетевой ответ.Но какие входные данные вам нужны для получения сетевого ответа?Ну, вам нужен адрес электронной почты и пароль, но инцидент, связанный с подстрекательством, нажимается на кнопку входа в систему, и запрос не должен выполняться, если данные неверны:
let networkResponse = loginTrigger
.withLatestFrom(credentials)
.filter { $0.email.isEmail && !$0.password.isEmpty }
.flatMapLatest {
network.login(with: $0)
.materialize()
}
.share(replay: 1)
let user = networkResponse
.filter { $0.element != nil }
.map { $0.element! }
Теперь, какие входные данные вам нужнысделать вывод Error?Вам нужна ошибка из сетевого запроса, если она есть, и вам необходимо знать, были ли адрес электронной почты или пароль недействительными.Тем не менее, вы хотите узнать о недопустимом вводе, только если нажата кнопка входа в систему ...
Это много, но вот как это ломается:
let networkError = networkResponse
.filter { $0.error != nil }
.map { $0.error! }
let invalidEmailError = loginTrigger
.withLatestFrom(email)
.filter { !$0.isEmail }
.map { _ in UIError.badEmail as Error }
let invalidPasswordError = loginTrigger
.withLatestFrom(password)
.filter { $0.isEmpty }
.map { _ in UIError.badPassword as Error }
let error = Observable.merge(networkError, invalidEmailError, invalidPasswordError)
Видите, как это работает?Возьмите каждый выход по очереди и выясните, какие входы вам нужны, чтобы этот выход работал.