LoginSignup
1
0

More than 3 years have passed since last update.

RxSwiftでVoidをonNextした時、subscribeが処理されなかった

Posted at

とある処理

RxSwiftを正しく使ってないとかそういうことは置いておいて、下記のような記述があった。

class HogeView: UIView {
    private subject: PublishSubject<Void> = PublishSubject()
    var observer: Observable<Void> { return subject }

    @IBOutlet func onTap(_ sender: UIButton) {
        subject.onNext(())
    }
}

class HogeViewController: UIViewController {
    @IBOutlet weak var hogeView: HogeView!

    override func viewDidLoad() {
        super.viewDidLoad()
        hogeView.observer.subscribe {
            // 処理
        }
    }
}

このhogeView.observer.subscribeの処理部分がボタンをタップしても動かず、なんでだろうと悩んだ。

結論

subscribeのevent引数を省略していたことで、今回の問題が起きていた。
event.elementはどうせVoidだしボタンのタップだけ検知できればいいから、eventいらないと記述を忘れていた結果、

public func subscribe(onCompleted: (() -> Void)? = nil, onError: ((Error) -> Void)? = nil) -> RxSwift.Disposable

が推論として呼ばれるようになっていた。

下記記述にしたことで、意図通り動いた。

class HogeView: UIView {
    private subject: PublishSubject<Void> = PublishSubject()
    var observer: Observable<Void> { return subject }

    @IBOutlet func onTap(_ sender: UIButton) {
        subject.onNext(())
    }
}

class HogeViewController: UIViewController {
    @IBOutlet weak var hogeView: HogeView!

    override func viewDidLoad() {
        super.viewDidLoad()
        hogeView.observer.subscribe { (_) in // event引数を省略しない
            // 処理
        }
    }
}

備考

debug オペレータを使ってデバッグしろとアドバイス貰って、onNextが正常に飛んできているのを確認できたので、subscribeに問題あることがわかり解決できた。

初歩的なミスだった。
備忘録がてら記述しておく。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0