48725


RxSwiftを始めて間もないため、タイトルが変でしたらご了承ください。

RxSwiftのサンプルにある、Simple Validationを写経して学習していました。  
<https://qiita.com/kzykbys/items/3bbb4fa24d30917afd05#simple-validation>

その際、Observableにbind処理をし、その後disposedでDisposeBagを設定すると、textFieldに値を入れても、バリデーションの処理が行われません。

変わりにdisposedをコメントアウトすると、処理が動くようになりました。

RxSwiftのサンプルではdisposedを使っても動作していたため、理由がわからず困っています。  
RxSwiftのバージョンは4.3.1です。

こちらの画面を初期画面として呼び出しています。

どうぞよろしくおねがいします。

[code]

    import UIKit
    import RxSwift
    import RxCocoa
    
    fileprivate let minimalUsernameLength = 5
    fileprivate let minimalPasswordLength = 5
    
    class ValidationViewController: UIViewController {
    
        @IBOutlet weak var userNameTextField: UITextField!
        @IBOutlet weak var passwordTextField: UITextField!
    
        @IBOutlet weak var userNameDescriptionLabel: UILabel!
        @IBOutlet weak var passwordDescriptionLabel: UILabel!
    
        @IBOutlet weak var loginButton: UIButton!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            let disposeBag = DisposeBag()
    
            let usernameValidate = userNameTextField.rx.text.orEmpty
                .map{ text -> Bool in
                    print("比較処理実行")
                    return text.count >= 5
                }
                .share(replay: 1)
    
            let passwordValidate = passwordTextField.rx.text.orEmpty
                .map { $0.count >= minimalPasswordLength }
                .share(replay: 1)
    
            let loginButtonValidate = Observable.combineLatest(usernameValidate, passwordValidate){ $0 && $1 }
                .share(replay: 1)
    
            usernameValidate
                .bind(to: passwordTextField.rx.isEnabled)
                //.disposed(by: disposeBag) //コメントアウトすることで比較処理が行われ、表示制御ができるようになります。
    
            usernameValidate
                .bind(to: userNameDescriptionLabel.rx.isHidden)
                //.disposed(by: disposeBag)
    
            passwordValidate
                .bind(to: passwordDescriptionLabel.rx.isHidden)
                .disposed(by: disposeBag)
    
            loginButtonValidate
                .bind(to: loginButton.rx.isEnabled)
                //.disposed(by: disposeBag)
    
            loginButton.rx.tap
                .subscribe(onNext: { [weak self] _ in self?.showAlert() })
                //.disposed(by: disposeBag)
    
    
        }
    
        func showAlert() {
            let alertView = UIAlertView(
                title: "RxExample",
                message: "This is wonderful",
                delegate: nil,
                cancelButtonTitle: "OK"
            )
    
            alertView.show()
        }
    
        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }
    
[/code]


CC BY-SA 4.0
2018-09-26T08:34:40.373
48723
2019-06-29T04:39:54.577
2019-06-29T04:39:54.577
9008
13447
question
swift reactive-programming rx-swift
RxSwiftのObservableにDisposeBag処理を行うと、画面起動後の処理に反応しなくなる


`let disposeBag = DisposeBag()`  
の生存期間（スコープ）が`viewDidLoad`のせいです。

`DisposeBag`は`ValidationViewController`のプロパティに持たせましょう。

`DisposeBag`はどのインスタンスと運命共同体（メモリ解放のタイミングを同じにするという意味合い）なのか自分で意識して必要なところに定義することが肝心です。


CC BY-SA 4.0
2018-09-26T10:30:09.943
48725
2018-09-26T10:42:11.280
2018-09-26T10:42:11.280
9008
9008
48723
answer