onReceiveを使用した「タイマー処理」や「通知」、「ネットワークからデータを受信した時」のプログラミング

この記事は約5分で読めます。

SwiftUIでリアクティブなコードを書く際に、onReceiveモディファイアが役立ちます。
特定のパブリッシャーからデータを受信するたびにアクションを実行するために使用されます。この記事では、onReceiveの使い方を具体的な例とともに紹介します。

  • iOS:13.0以上
  • XCode(当サイトの環境):15.0.1

onReceiveとは?

onReceiveは、Combineフレームワークなどのパブリッシャーからデータを受信したときに特定のアクションを実行するためのSwiftUIモディファイアです。
タイマーや通知、ネットワークの応答など、さまざまなデータソースからのデータ変更に反応することができます。

基本的な使い方

以下の例は、タイマーを使用して1秒ごとにカウンターを更新する方法を示しています。

例:タイマーを使用したカウンター

import SwiftUI

struct OnReceiveSmp: View {
    @State private var counter = 0
    private let timer = Timer.publish(every: 1.0, on: .main, in: .common).autoconnect()

    var body: some View {
        Text("Counter: \(counter)")
            .padding()
            .onReceive(timer) { _ in
                counter += 1
            }
    }
}

この例では、timerが毎秒発行するイベントを受信し、カウンターをインクリメントします。

通知センターとonReceive

通知センターからの通知を受け取るためにonReceiveを使用することもできます。

例:アプリがフォアグラウンドに戻ったときの処理

import SwiftUI

struct OnReceiveSmp: View {
    @State private var message = "Waiting for notification"

    var body: some View {
        Text(message)
            // アプリがForeGroundになった時
            .onReceive(NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)) { _ in
                message = "App is back in foreground"
            }
            // アプリがバックグラウンドで動作している時
            .onReceive(NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification)) { _ in
                message = "App is back in Background"
            }
    }
}
アプリがバックグラウンドで動作している時
アプリがフォアグラウンドで動作している時

この例では、アプリがフォアグラウンドに戻ったときに通知を受け取り、メッセージを更新します。

CombineフレームワークとonReceive

onReceiveは、Combineフレームワークのパブリッシャーと組み合わせて使用することで、複雑なデータフローを簡単に管理できます。

例:ネットワークからのデータ受信

import SwiftUI
import Combine

class DataFetcher: ObservableObject {
    @Published var data: String = "Loading..."

    func fetchData() {
        // 実際のネットワークリクエストのシミュレーション
        DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
            self.data = "Data received from network"
        }
    }
}

struct ContentView: View {
    @ObservedObject var fetcher = DataFetcher()

    var body: some View {
        Text(fetcher.data)
            .padding()
            .onAppear {
                fetcher.fetchData()
            }
            .onReceive(fetcher.$data) { newValue in
                print("New data received: \(newValue)")
            }
    }
}

この例では、DataFetcherクラスがネットワークからデータをフェッチし、onReceiveモディファイアが新しいデータを受信したときに処理を実行します。

まとめ

onReceiveモディファイアは、SwiftUIでリアクティブなアプリケーションを構築するためのツールです。
タイマー、通知、ネットワーク応答など、さまざまなデータソースに対してリアクティブに反応できます。
この記事で紹介した例を参考にして、onReceiveを活用してみてください。

タイトルとURLをコピーしました