【Swift/Combine】handleEventsメソッドの使い方と役割!イベント取得

この記事からわかること

  • SwiftCombineフレームワーク使い方
  • handleEventsメソッド役割
  • 実装サンプル
  • イベント取得
  • receiveSubscription/receiveOutput/receiveCompletion/receiveCancel/receiveRequest違い

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

SwiftのCombineフレームワークとは非同期処理やストリーム処理、データのバインディング、イベントハンドリングなどのリアクティブプログラミングに倣った機能を提供しているApple純正のフレームワークです。今回はその中のhandleEventsメソッドについてまとめていきます。

handleEventsメソッドとは?

公式リファレンス:handleEvents

func handleEvents(
    receiveSubscription: ((Subscription) -> Void)? = nil,
    receiveOutput: ((Self.Output) -> Void)? = nil,
    receiveCompletion: ((Subscribers.Completion<Self.Failure>) -> Void)? = nil,
    receiveCancel: (() -> Void)? = nil,
    receiveRequest: ((Subscribers.Demand) -> Void)? = nil
) -> Publishers.HandleEvents<Self>

handleEventsメソッドはPublisherの任意のイベントが発生した際に指定のクロージャを実行するメソッドです。このメソッドを使用することでパブリッシャーのイベントに応じた処理を挿入することが可能になります。監視できるイベントは値の発行や、エラー、完了などです。

handleEventsメソッドを付与しても購読が始まるわけでないのでsinkメソッドを実行して購読を開始する必要があります。

監視できるイベント

監視できるイベントを具体的には以下の5種類となっています。

receiveSubscription

パブリッシャーが上流パブリッシャーからサブスクリプションを受け取ったときに実行されるオプションのクロージャ

receiveOutput

パブリッシャーが上流のパブリッシャーから値を受け取ったときに実行されるオプションのクロージャ

receiveCompletion

上流のパブリッシャーが正常に終了するか、エラーで終了するときに実行されるオプションのクロージャ

receiveCancel

ダウンストリーム受信者がパブリッシュをキャンセルしたときに実行されるオプションのクロージャ

receiveRequest

パブリッシャーが追加の要素のリクエストを受け取ったときに実行されるオプションのクロージャ

実装サンプル

例えばイベントのタイミングでログを出力する場合は以下のようになります。

let publisher = Deferred {
    Future<String, Never>() { promise in
        print("In Future")
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            promise(.success("成功したよ"))
        }
    }
}

let cancellable = publisher
    .handleEvents(
        receiveSubscription: { subs in
            print("Subscription: \(subs.combineIdentifier)")
        }, receiveOutput: { anInt in
            print("in output handler, received \(anInt)")
        }, receiveCompletion: { _ in
            print("in completion handler")
        }, receiveCancel: {
            print("received cancel")
        }, receiveRequest: { (demand) in
            print("received demand: \(demand.description)")
        }
    ).sink { _ in return }

出力

In Future
Subscription: 0x600002108aa0
received demand: unlimited
in output handler, received 成功したよ
in completion handler

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index