はじめに
僕はもともとNSNotificationCenter
があまり好きではありません。
僕の中ではGOTO文
に近い位置付けで、使う時に違和感を覚えて使ってました。
トリガーがどこでイベントで発生したのか、どこのオブジェクトに通知するのかがさっぱりわからないカオス的な感じが自分にはありませんでした。
しかし、delegate
を駆使してできるとことはdelegate
で行い、もっと単純の場合はblock
構文を使うような実装を心がけてもNSNotificationCenter
は絶対に発生します。
(例えばプッシュ通知など)
なので、仕方なく使っていたのですが最近RxSwift
を使ってから一つの解が生まれました。
・・・という話です。
NSNotificationCenterの代わり
前置きが長いですが、解法は楽です。
例えば、以下のようなクラスを作成すれば解決です。
import RxSwift
class NotificationCenter {
static let observable = PublishSubject<String>()
}
通知したい方のプログラムは以下のような感じになります。
この例ではString
をインターフェースにしてますが、どのクラスでも受け渡せます。
NotificationCenter.observable.on(.Next("Notification"))
購買する側は以下のような形になります。
class TestViewController {
private let disposeBag = DisposeBag()
func sub() {
_ = NotificationCenter.observable.subscribeNext { (str) in
print(str)
}.addDisposableTo(disposeBag)
}
}
NSNotificationCenter
は購買と購買解除のタイミングがわかりにくく、購買解除をし忘れることもありますが、このようにすれば購買解除をする必要がありません。
(disposeBag
が解放されるタイミングで購買解除される。)
また、NSNotificationCenter
ではスペルミスなどが起こるとデータが正しく送信されませんし、インターフェースもAnyObject
になってしまうのでコードの保守性が弱くなります。
RxSwift
ならその点も安心です。
しかも、PublishSubject
でなくReplaySubject
を使うなどの局面に合わせた戦略をとるのがとても楽にできます。
というコード技法の紹介です。
RxSwift
を使ってる人には普通の事ですが・・・