【Swift/Combine】receive(on:)/subscribe(on:)の使い方!スレッドを変更する

この記事からわかること
- SwiftのCombineフレームワーク
- receive(on:)/subscribe(on:)メソッドの使い方
- Publisherの実行スレッドを変更する方法
\ アプリをリリースしました /
環境
- Xcode:15.0.1
- iOS:17.1
- Swift:5.9
- macOS:Sonoma 14.1
パイプラインのスレッドを変更する
Combineでパイプラインのスレッドを変更するためのメソッドとしてreceive(on:)
とsubscribe(on:)
があります。両方ともPublisher
から呼び出し引数にSchedulerを指定します。
Schedulerとは処理を実行するスレッドを管理するための仕組みです。ネットワークリクエストやCPU負荷の高い計算などバックグラウンドスレッドで実行したい処理やUI更新などのメインスレッドで実行したい処理を適切なスレッドで実行するために重要になってきます。
receive(on:)
receive(on:)
はPublisherから流れてくる値やイベントがどのScheduler上で受け取られるかを制御します。receive(on:)
オペレータが指定された位置から後の部分に影響を与えます。
実行させてみるとPublisherはメインスレッドで、後続のflatMapやsinkなどはバックグラウンドスレッドで行われていることがわかります。このようにオペレーターを呼び出した以降の処理が全て指定したスレッドになります。
subscribe(on:)
subscribe(on:)
はPublisherがどのScheduler上で実行されるかを制御します。subscribe(on:)
オペレータが指定された位置から前の部分に影響を与えます。
実行させてみると明示的にスレッドを指定したところ以外はPublisherはバックグラウンドスレッドで、後続のflatMapやsinkなどはメインスレッドで行われていることがわかります。このようにオペレーターを呼び出した以前の処理が全て指定したスレッドになります。
スレッドをこまめに切り替える
receive(on:)
とsubscribe(on:)
をこまめに使用することでスレッドを用途ごとに切り替えることができます。
RxSwiftのsubscribeOn/observeOn
RxSwiftにも同じような役割のメソッドが用意されています。
- RxSwift subscribeOn → Combine subscribe(on:)
- RxSwift observeOn → Combine receive(on:)
以下記事はRxJavaですがsubscribeOn/observeOnの使い方の参考にしてください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。