とある処理
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に問題あることがわかり解決できた。
初歩的なミスだった。
備忘録がてら記述しておく。