【发布时间】:2016-05-02 19:52:31
【问题描述】:
我是 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>>
【问题讨论】:
-
flatMapvsflatMapLatestgithub.com/baconjs/bacon.js/wiki/Diagrams