2017-05-04 7 views
1

RxSwiftについては比較的新しいので、ベストプラクティスを実装しようとしています。RxSwfit:提示されたView Controllerビューモデルに登録するのは悪い習慣ですか?

私のホームビューコントローラでは、ユーザーがテキストフィールドにテキストを入力して確認するカスタムアラートビューコントローラを提示する必要があります。テキストが有効であると仮定すると、アラートは終了し、新しいView Controllerがプッシュされます。

コールバックまたはデリゲートを使用しないようにするには、アラートビューコントローラを表示してから、ホームビューコントローラがアラートビューコントローラのテキストフィールドと確認ボタンにサブスクライブします。

別のビューコントローラを購読することは悪い習慣ですか?

擬似コード

let alert = viewModel.textFieldAlert() 
    present(alert) 
    alertSubscriptions(alert) 

alertSubscriptions

alert.textField.rx.text.subscribe(onNext: { [weak self] text in 
     self?.viewModel.numberOfItems.value = text ?? "" 
    }).addDisposableTo(disposeBag) 

    alert.confirmButton.rx.tap.subscribe(onNext: { [weak self] _ in 
     guard self != nil else { return } 
     if !self!.viewModel.validText { return } 
     alert.dismiss() 
     self!.alertConfirmed() 
    }).addDisposableTo(disposeBag) 

私はこのコードをテストしているし、それが何の問題もなく動作します。

答えて

2

私はこの件に関して記事を書いたことがあります。https://medium.com/@danielt1263/encapsulating-the-user-in-a-function-ec5e5c02045fこの記事ではPromisesを使用していますが、Rxを使用する場合はIMHOと同じ手順が必要です。

私はこのようなものが良いだろうと思う:

extension UIViewController { 

    func infoAlert(title: String, message: String, isValidInput: @escaping (String) -> Bool) -> Observable<String> { 
     let alert = UIAlertController(title: title, message: message, preferredStyle: .alert) 

     let confirm = PublishSubject<Void>() 
     let confirmed = UIAlertAction(title: "OK", style: .default) { (action) in 
      confirm.onNext() 
     } 

     let text = PublishSubject<String>() 
     alert.addTextField { textField in 
      textField.placeholder = "Enter Data" 
      _ = textField.rx.text.orEmpty.bind(to: text) 
     } 

     _ = text.map(isValidInput) 
      .bind(to: confirmed.rx.isEnabled) 

     alert.addAction(confirmed) 

     present(alert, animated: true, completion: nil) 
     return confirm.withLatestFrom(text) 
    } 
} 

シーケンスエミッタ関数内のすべてのコードを含有することにより(すなわち、観測可能を返す関数、)あなたに機能を追加するための扉を開きます観察可能な連鎖。

たとえば、上記の関数は、View Controllerのボタン・プレスからフラット・マップすることも、そうでない場合はObservableパイプラインに追加することもできます。

関連する問題