はじめに
これまではイベントの発行と購読にはRxSwiftなどの外部ライブラリを導入していたと思いますが、WWDC2019にてついにApple標準のイベントの発行と購読を可能にしたフレームワーク、Combineが発表されました。
ただしiOS13以上でしか利用できないので注意が必要です。
今回はそんなCombineの簡単なイベント発行と購読、流れてくる値の加工についてテキストフィールドを例に説明していきます。
押さえておきたい役割
Publisher(発行者)
★Publisher
型が一連の値を長期にわたって送信できることを宣言するためのプロトコル
NotificationCenterにはPublisherを戻り値とする以下のメソッドが用意されています
★publisher(for: object: )
通知の名前と通知元のソースオブジェクトを受け取り、通知要素を生成するPublisherを返します
Operator(値の加工)
★map(_: ), flatMap(maxPublishers: _: ), reduce(_: _: )
Swift標準ライブラリの同等の演算子と使い方は同じなので説明は割愛します
Subscriber(購読者)
★Subscriber
Publisherから通知を受け取ることができる型を宣言するためのプロトコル
Publisherに準拠した型にはSubscriberを戻り値とする以下のメソッドが用意されています
★sink(receiveCompletion: receiveValue: )
値を受け取って処理を行う
★assign(to: on: )
受け取った値を指定したプロパティに割り当てる
テキストフィールドの値変更の通知を受け取る
let sub = NotificationCenter.default
.publisher(for: NSControl.textDidChangeNotification, object: filterField)
.map( { ($0.object as! NSTextField).stringValue } )
.sink(receiveCompletion: { print ($0) },
receiveValue: { print ($0) })
★解説
NotificationCenterのpublisherメソッドでテキストフィールドのテキストの変更の監視を宣言し、mapメソッドで流れてくる値をString型に変換し、sinkメソッドで受け取った値をprintで出力している
必要に応じて購読をキャンセル
Publisherは、正常に完了するか失敗するまで、イベントを発行し続けます。Publiserを購読する必要がなくなった場合は、購読をキャンセルできます。
Subscriberプロトコルはcancell()メソッドを提供するCancellableプロトコルを実装しています。
sub?.cancel()