RxCocoa でクラスの特定のメソッドをフックする
以前書いた ReactorKit の概要編のサンプル実装をしている際に、「ViewWillAppear
で処理を行いたんだけど、rx
で呼び出せないかな〜」と思っていたら、RxCocoa にはクラスの特定の関数をフックするプロパティが用意されていたのを最近知ったのでちょこっと使ってみようと思います。
提供されている関数
用意されている関数は下記の2つがあり、sentMessage
がメソッドが呼ばれた時に通知され、methodInvoked
がメソッドの処理が完了した直後に通知されます。
rx.sentMessage(Selector)
rx.methodInvoked(Selector)
使ってみる
sentMessage
と methodInvoked
を使ったサンプルコードが下記になります。
rx.sentMessage(#selector(viewWillAppear(_:)))
.subscribe(onNext: { _ in
print("viewWillAppearが呼ばれた直後です")
})
.disposed(by: disposeBag)
rx.methodInvoked(#selector(viewWillAppear(_:)))
.subscribe(onNext: { _ in
print("viewWillAppearの処理が終わった直後")
})
.disposed(by: disposeBag)
また、当然ですが下記のように自分で定義した関数もフックすることができ @IBAction
のメソッドなんかも問題なくフックできます。
rx.sentMessage(#selector(hoge))
.subscribe(onNext: { _ in
print("hogeが呼ばれた直後です")
})
.disposed(by: disposeBag)
余談ですが、ReactorKit の StoryboardView
を使った際に呼ばれる bind(reactor:)
メソッドの際に sentMessage
や methodInvoked
でフックしようとしても通知されないので注意が必要です。理由は、StoryBoardView
プロトコルで定義されている bind(reactor:)
メソッドは ViewDidLoad
の後に呼ばれるためです。このように、View の初期化時に処理したい場合は下記のように記述します。
func bind(reactor: MyReactor) {
Observable.just(Void())
}
参考
Author And Source
この問題について(RxCocoa でクラスの特定のメソッドをフックする), 我々は、より多くの情報をここで見つけました https://qiita.com/yum_fishing/items/8646a553127b19acb77b著者帰属:元の著者の情報は、元の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 .