LoginSignup
2
3

More than 3 years have passed since last update.

Combineを使用したイベントの受信と処理

Posted at

はじめに

これまではイベントの発行と購読には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: )
受け取った値を指定したプロパティに割り当てる

テキストフィールドの値変更の通知を受け取る

sample.swift
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プロトコルを実装しています。

sample.swift
sub?.cancel()
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3