今回はSwiftUIを使用する上で必ず押さえておきたいCombineフレームワークについて説明していきます。
Combineフレームワークとは
Combineフレームワークの役割は、一言で説明するとViewとデータの状態を非同期で連動させることです。今まではRxSwiftやReactiveCocoa,ReactiveSwiftのような外部のフレームワークを使う開発が多かったと思いますが、ついにAppleからこのようなフレームワークがリリースされました。(といっても発表されたのは2019年。ほぼ2年前ですが…。)
Appleのリファレンス
Appleの公式ドキュメントを見てみると以下のような説明が書かれています。
イベント処理演算子を組み合わせて、非同期イベントの処理をカスタマイズします。
概要
Combineフレームワークは、時間の経過とともに値を処理するための宣言型SwiftAPIを提供します。これらの値は、さまざまな種類の非同期イベントを表すことができます。 Combineは、Publisherが時間の経過とともに変化する可能性のある値を公開し、SubscriberがPublisherからそれらの値を受け取ることを宣言します。
・Publisherプロトコルは、時間の経過とともに一連の値を配信できるタイプを宣言します。Publisherには、上流のPublisherから受け取った価値に基づいて行動し、それらを再出版するOperatorがいます。
・Publisherのチェーンの最後で、Subscriberは要素を受け取ったときに要素に基づいて動作します。Publisherは、Subscriberから明示的に要求された場合にのみ値を発行します。これにより、Subscriberコードは、接続しているPublisherからイベントを受信する速度を制御できます。
いくつかのFoundationタイプは、Timer、NotificationCenter、URLSessionなど、Publisherを通じて機能を公開します。 Combineは、Key-ValueObservingに準拠するすべてのプロパティに組み込みのPublisherも提供します。
複数のPublisherの出力を組み合わせて、それらの相互作用を調整できます。たとえば、テキストフィールドの発行元からの更新をサブスクライブし、テキストを使用してURL要求を実行できます。その後、別のPublisherを使用して応答を処理し、それらを使用してアプリを更新できます。
Combineを採用することで、イベント処理コードを一元化し、ネストされたクロージャや規則ベースのコールバックなどの面倒な手法を排除することで、コードの読み取りと保守が容易になります。
Publisher、Subscriber、Operatorという言葉が出てきました。これらについて説明していきましょう。
Publisher
Publisherとは、時間経過とともに特定の値を送信させるプロトコルです。送信する値とエラーの型を定義して1つ以上のSubscriverインスタンスへその要素を送信します。その際、Publisher側で定義した送信する値とエラーの型と、Subscriber側で定義した受け入れる値とエラーの型が一致している必要があります。また、Publisherには receive(subscriber:) メソッドが用意され、このメソッドを呼ぶことで受け取り側のSubscriverをPublisherに登録します。
Subscriber
Subscriberとは、Publisherから送信された値を受け取り、その状況に合わせて完了/エラーといったイベントを受け取ります。Subscriberの受け取る値とエラーイベントの型は、対応するPublisherと一致する必要があります。
Operator
Operatorは、PublisherからSubscriberに値が渡される前に、値に加工を加える処理を行います。
簡単にまとめると、Publisherは値を送信し、Subscriberはその値を受信し、Operatorはその値を加工するという役割になります。
実装例
では実際にどのように実装して使用するのか見ていきましょう。
コメント