Я очень новичок в RxSwift, и я пытаюсь начать с простого экрана входа. Таким образом, у меня есть 2 текстовых поля и кнопка входа в систему, которая привязывается к PublishSubject
, поэтому каждый раз, когда я нажимаю кнопку, я отправляю сетевой запрос для выполнения проверки подлинности.
Поскольку аутентификация может завершиться неудачно, я пошел с Driver
, чтобы я мог повторять свой запрос каждый раз, когда я нажимаю кнопку.
У меня есть 2 варианта того, что я думаю, это тот же код, но один работает, а другой нет. Я пытаюсь понять, что происходит за сценой.
Здесь первая версия, которая работает (запрос каждый раз, когда я касаюсь кнопки):
let credentials = Driver.combineLatest(email.asDriver(), password.asDriver()) { ($0, $1) }
self.signIn = signInTaps
.asDriver(onErrorJustReturn: ())
.withLatestFrom(credentials)
.flatMapLatest { email, password in // returns Driver<Result<AuthenticateResponse, APIError>>
return provider.request(.Authenticate(email: email, password: password))
.filterSuccessfulStatusCodes()
.mapObject(AuthenticateResponse)
.map { element -> Result<AuthenticateResponse, APIError> in
return .Success(element)
}
.asDriver { error in
let e = APIError.fromError(error)
return Driver<Result<AuthenticateResponse, APIError>>.just(.Failure(e))
}
.debug()
}
А вот тот, который не работает (запрос срабатывает только при первом щелчке):
let credentials = Observable.combineLatest(email.asObservable(), password.asObservable()) { ($0, $1) }
self.signIn = signInTaps.asObservable()
.withLatestFrom(c)
.flatMapLatest { email, password in // returns Observable<AuthenticateResponse>
return provider.request(.Authenticate(email: email, password: password))
.filterSuccessfulStatusCodes()
.mapObject(AuthenticateResponse)
}
.map { element -> Result<AuthenticateResponse, APIError> in // returns Observable<Result<AuthenticateResponse, APIError>>
return .Success(element)
}
.asDriver { error in // returns Driver<Result<AuthenticateResponse, APIError>>
let e = APIError.fromError(error)
return Driver<Result<AuthenticateResponse, APIError>>.just(.Failure(e))
}
.debug()
Для информации, здесь мое объявление свойств:
let email = Variable("")
let password = Variable("")
let signInTaps = PublishSubject<Void>()
let signIn: Driver<Result<AuthenticateResponse, APIError>>