2017-11-03 3 views
0

MVVMを使用してRxSwiftを実装しようとしているアプリケーションがあります。RxSwiftとmvvmを使用してモヤリクエストを作成するときにスピナーを追加し、ユーザーが応答を受け取ったときにそれを却下します。

私は検証を行っているSignInViewModelを持っています。私が聞いている残りの応答ブール値でログインobservableを更新しています。

コントローラクラスで、検証が成功すると、ログインボタンが有効になります。

同様の方法で、ボタンをクリックしてスピナーを開始し、ユーザーが応答を受け取ったときに閉じることができます。

コントローラクラスのビューモデルからloginObservableを再生しようとします。バインドブロックにヒットしません。

問題の原因を特定できません。

すべてのヘルプには、以下の

を理解されるであろう後

class SignInViewModel { 

    let validatedEmail: Observable<Bool> 
    let validatedPassword: Observable<Bool> 
    let loginEnabled: Observable<Bool> 
    let loginObservable: Observable<Bool> 

    init(username: Observable<String>, 
     password: Observable<String>, 
     loginTap: Observable<Void>) { 

     self.validatedEmail = username 
      .map { $0.characters.count >= 5 } 
      .shareReplay(1) 

     self.validatedPassword = password 
      .map { $0.characters.count >= 2 } 
      .shareReplay(1) 

     self.loginEnabled = Observable.combineLatest(validatedEmail, validatedPassword) { $0 && $1 } 
     let userAndPassword = Observable.combineLatest(username, password) {($0,$1)} 

     self.loginObservable = loginTap.withLatestFrom(userAndPassword).flatMapLatest{ (username, password) in 
      return RestService.login(username: username, password: password).observeOn(MainScheduler.instance) 
     } 
    } 
} 

私SignInViewModelである私のRestServiceクラスです

class RestService:NSObject { 

    static var moyaRequest = MoyaRequest() 
    static var disposeBag = DisposeBag() 

static func login(username: String, password: String) -> Observable<Bool> { 
    let userData = Creator() 
    userData?.username = username 
    userData?.password = password 
    print("Username password", userData?.username, userData?.password) 
    return Observable.create { observer in moyaRequest.signIn(userData: userData!).subscribe{ event -> Void in 
     switch event { 

     case .next(let response): 
      print("Response",response) 

     case .error(let error): 
      let moyaError: MoyaError? = error as? MoyaError 
      let response: Response? = moyaError?.response 
      let statusCode: Int? = response?.statusCode 

      print("Sample Response code error" + String(describing: statusCode)) 
     default: 
      break 
     } 
     } 
     return Disposables.create() 
    } 

} 
後moyaRequestクラス

final class MoyaRequest{ 
    func signIn(userData: Creator) -> Observable<Response> { 
      return provider.request(.signIn(userData)) 
       .filter(statusCode: 200) 
     } 
} 

です3210

}

コントローラモデルでビューモデルをバインドしようとしています。

class SignInViewController: UIViewController{ 

    let disposeBag = DisposeBag() 
    @IBOutlet weak var passwordTextfield: UITextField! 
    @IBOutlet weak var usernameTextfield: UITextField! 

    private var viewModel : SignInViewModel! 
    @IBOutlet weak var signInButton: UIButton! 
    override func viewDidLoad() { 
     setUpRxViewModel() 

    } 

    func setUpRxViewModel(){ 
     self.viewModel = SignInViewModel(username: self.usernameTextfield.rx.text.orEmpty.asObservable(), 
             password: self.passwordTextfield.rx.text.orEmpty.asObservable(), 
             loginTap: self.signInButton.rx.tap.asObservable()) 

     self.viewModel.loginEnabled.bind{ valid in 
      self.signInButton.isEnabled = valid 
      }.addDisposableTo(disposeBag) 

     self.viewModel.loginObservable.bind{ input in 
      print("Login Clicked") 
      }.addDisposableTo(disposeBag) 


    } 
} 

答えて

1

loginメソッドでは、オブザーバーにイベントをディスパッチしていません。それは次のようになります。

case .next(let response): 
      observer.on(.next(true)) 
      print("Response",response) 

case .error(let error): 
      observer.on(.error(error)) 
      //or observer.on(.next(false)) if you intend to use Bool as indicator of operation success which is a very bad idea. 
      let moyaError: MoyaError? = error as? MoyaError 
      let response: Response? = moyaError?.response 
      let statusCode: Int? = response?.statusCode 

はさらに、私はあなたがRxSwiftでモヤを使用している場合、あなたはどこにでもRxMoyaProviderを使用してお勧めします。 Observable.createを使用すると、通常何か間違っていることを意味します。

また、ネットワーク要求のレベルでステータスコードに基づいてイベントをフィルタリングしないでください。何か問題が生じた場合、チェーン内にイベントを受け取らないためです。

+0

私はRxMoyaProviderを使用しています。 。 Observable.createを使用しないと、関数はエラーを返します。 Observable.createを使用せずにどのように動作させることができますか? –

+0

@ A.S受信しているエラーは何ですか? –

関連する問題