안녕하세요 저는 RxSwift를 배우고 있는데 makeLoginRequest가 두 번 호출되는 이유를 모르겠습니다 ... 로그인이 올바른 경우 다른 컨트롤러로 푸시하지만 관찰 가능 상태가 다른 이벤트를 계속 알립니다. 그것은 뷰 모델 코드에서 두 이벤트가 RxSwift와 함께 발생했습니다
이있다 두 번 다음 컨트롤러를 ... 밀어 :let userName : Driver<String>
let password : Driver<String>
var credentials : Driver<(String, String)> {
return Driver.combineLatest(userName, password) { usr, pwd in
return (usr, pwd)
}
}
var credentialValid : Driver<Bool> {
let usrValid = userName
.map { $0.rangeOfString("@") != nil }
let pwdValid = password
.map { $0.utf8.count > 5 }
return Driver.combineLatest(usrValid, pwdValid) { usr, pwd in
return (usr && pwd)
}
}
func login() -> Observable<Login?>
{
return credentials.asObservable()
.observeOn(MainScheduler.instance)
.flatMapLatest { credential -> Observable<Login?> in
return self.makeLoginRequest(user: credential.0, password: credential.1)
}
}
func makeLoginRequest(user user: String, password: String) -> Observable<Login?>
{
return self.provider
.request(APIProvider.Login(credentials: (user, password)))
.debug()
.mapObjectOptional(Login.self)
}
및
loginModel = LoginViewModel(provider: apiProvider! as! RxMoyaProvider<APIProvider>, userName: userTextField.rx_text.asDriver(), password: passwordTextField.rx_text.asDriver())
loginModel.credentialValid
.driveNext { [unowned self] valid in
self.loginButton.enabled = valid
}
.addDisposableTo(disposeBag)
loginButton.rx_tap
.debug()
.flatMap({ self.loginModel.login() })
.subscribeNext({ login in
// handle here login data
})
.addDisposableTo(disposeBag)
누구나 무슨 일이 일어나고 있는지 설명 할 수있는 컨트롤러의
?감사합니다!
내가 지적한 자격 증명으로 원래 응답을 편집했습니다. 중첩 된 구독이 없으므로 올바른 방법은 무엇입니까? 문제는 makeLoginRequest 메소드가 두 번 호출되고 뷰 컨트롤러를 푸시하는 것입니다. 두 번 실행하면 두 번 푸시되며 절대적으로 잘못되었습니다. – jerrygdm
다시 말하지만, 중첩 된'subscribeNext' 대신'flatMap'을 사용해야합니다. 그러면 현재 Observable을 대체 할 것이므로 한 번만 구독 할 수 있습니다. 편집 결과는'credentialValid' 사용법을 보여 주지만, 문제는 아닌 것으로 보입니다. 아직 알려지지 않은'userName','password' 또는'provider' 속성이 문제가 될 수 있다고 생각합니다. 그러나 다시, 코드를 보지 않고서는 말할 수 없습니다. 다시 한 번이 문제를 여기에 게시 할 수있는 간단한 것으로 분해해야합니다. 그렇게함으로써 틀린 것이 무엇인지를 알아 내고, 그렇지 않다면, 적어도 그것을 실행할 수 있습니다. – solidcell
나는 flatmap을 어떻게 사용할 수 있는지 알아 낸다. 그러나 해결책은 아니다. – jerrygdm