NSNotificationCenterはもう古い。

  • 37
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

僕はもともと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を使ってる人には普通の事ですが・・・