RxSwiftでVoidをonNextした時、subscribeが処理されなかった
とある処理
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に問題あることがわかり解決できた。
初歩的なミスだった。
備忘録がてら記述しておく。
Author And Source
この問題について(RxSwiftでVoidをonNextした時、subscribeが処理されなかった), 我々は、より多くの情報をここで見つけました https://qiita.com/aryzae/items/137677baef1f032d6ce2著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .