【Swift/Combine】handleEventsメソッドの使い方と役割!イベント取得
この記事からわかること
- SwiftのCombineフレームワークの使い方
- handleEventsメソッドの役割
- 実装サンプル
- イベント取得
- receiveSubscription/receiveOutput/receiveCompletion/receiveCancel/receiveRequestの違い
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
環境
- Xcode:15.0.1
- iOS:17.0
- Swift:5.9
- macOS:Sonoma 14.1
SwiftのCombineフレームワークとは非同期処理やストリーム処理、データのバインディング、イベントハンドリングなどのリアクティブプログラミングに倣った機能を提供しているApple純正のフレームワークです。今回はその中の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
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。