2016-08-05 4 views
0

안녕하세요 저는 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) 

누구나 무슨 일이 일어나고 있는지 설명 할 수있는 컨트롤러의

?

감사합니다!

답변

1

표시하지 않은 코드는 아마도 userName, password 또는 provider 일 것입니다. 또한 credentialsValid을 포함 시켰지만 사용되지 않았습니다. 그래서 다시, 아마 그 방법으로 뭔가를 어떻게 실제 코드에서 사용하고 있습니다.

참고로,보기 컨트롤러 에서처럼 중첩 된 subscribeNext을 사용하면 안됩니다. flatMap을 사용하고 마지막으로 Observable에 구독해야합니다.

우리가 실제로 실행할 수있는 문제를 보여주는 코드 예제를 제시 한 다음 도움을받을 수 있는지 확인하십시오. 당신은 아마도 그 예를 만들어서 당신 자신의 잘못을 알아낼 것입니다.

+0

내가 지적한 자격 증명으로 원래 응답을 편집했습니다. 중첩 된 구독이 없으므로 올바른 방법은 무엇입니까? 문제는 makeLoginRequest 메소드가 두 번 호출되고 뷰 컨트롤러를 푸시하는 것입니다. 두 번 실행하면 두 번 푸시되며 절대적으로 잘못되었습니다. – jerrygdm

+0

다시 말하지만, 중첩 된'subscribeNext' 대신'flatMap'을 사용해야합니다. 그러면 현재 Observable을 대체 할 것이므로 한 번만 구독 할 수 있습니다. 편집 결과는'credentialValid' 사용법을 보여 주지만, 문제는 아닌 것으로 보입니다. 아직 알려지지 않은'userName','password' 또는'provider' 속성이 문제가 될 수 있다고 생각합니다. 그러나 다시, 코드를 보지 않고서는 말할 수 없습니다. 다시 한 번이 문제를 여기에 게시 할 수있는 간단한 것으로 분해해야합니다. 그렇게함으로써 틀린 것이 무엇인지를 알아 내고, 그렇지 않다면, 적어도 그것을 실행할 수 있습니다. – solidcell

+0

나는 flatmap을 어떻게 사용할 수 있는지 알아 낸다. 그러나 해결책은 아니다. – jerrygdm

관련 문제