Open3

Swift Workoutまわり

ひろ@アプリ開発ひろ@アプリ開発

WorkoutSessionとWorkoutBuilderの関係性

WorkoutSession

WorkoutSessionは、ユーザーのワークアウトセッション(例:ランニング、ウォーキング、サイクリングなど)を管理します。このクラスを使って、ワークアウトのタイプ、期間、その他のパラメータを設定し、セッションを開始・終了することができます。

WorkoutBuilder

WorkoutBuilderは、ワークアウトのデータを効率よく収集・保存するためのクラスです。WorkoutSessionが動作している間に、このWorkoutBuilderを使用してデータ(例:心拍数、距離、カロリー消費量など)を収集します。

関係性

一般的に、WorkoutSessionがセッションの制御(開始、一時停止、終了)を担当する一方で、WorkoutBuilderはそのセッションで収集されたデータを管理します。多くの場合、WorkoutSessionが開始されると同時にWorkoutBuilderも開始され、データ収集が始まります。

デリゲート処理

デリゲートは、イベントが発生した際に何をするかを定義する仕組みです。WorkoutSessionには、セッションの状態変更(例:開始、一時停止、終了)を監視するデリゲートメソッドがあります。これによって、アプリはワークアウトセッションのライフサイクルに合わせて特定の処理を行うことができます。

同様に、WorkoutBuilderにもデリゲートがあり、データが新しく追加されたり更新された時に呼び出されるメソッドを持っています。

タイミングと役割

WorkoutSession: セッションが開始された、一時停止した、終了した等のイベントが発生すると、関連するデリゲートメソッドが呼び出されます。
WorkoutBuilder: 新しいワークアウトデータが収集された場合、そのデータを処理するためのデリゲートメソッドが呼び出されます。

ひろ@アプリ開発ひろ@アプリ開発

一般的なステップ

  1. WorkoutSessionの開始: HKWorkoutSessionのインスタンスを作成してセッションを開始します。

  2. データ収集: WorkoutSessionが稼働している間、WorkoutBuilderはユーザーの活動に関するデータを収集します。

  3. WorkoutSessionの終了: ユーザーがワークアウトを終了すると、HKWorkoutSessionを終了します。

  4. Workoutの作成: WorkoutBuilderは収集したデータをもとにHKWorkoutオブジェクトを作成します。

  5. Workoutの保存: 作成したHKWorkoutオブジェクトをHealthKitストアに保存します。

ひろ@アプリ開発ひろ@アプリ開発

func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) のデリゲートメソッドについて

機能とタイミング
機能:
このメソッドは、HKLiveWorkoutBuilderが新しいデータを収集した際に呼ばれます。このデータはHKSampleType(例:心拍数、移動距離など)の形で提供され、リアルタイムでアプリにワークアウトデータの更新を通知します。

タイミング:
通常、このメソッドはワークアウトセッションが進行中に複数回呼ばれることがあります。新しい種類のデータ(collectedTypes)が収集されるたびにトリガーされます。

例:

func workoutBuilder(_ workoutBuilder: HKLiveWorkoutBuilder, didCollectDataOf collectedTypes: Set<HKSampleType>) {
    for type in collectedTypes {
        if let quantityType = type as? HKQuantityType {
            let statistics = workoutBuilder.statistics(for: quantityType)
            // データを利用した処理(例:UIの更新)
        }
    }
}

この関数内で、workoutBuilder.statistics(for: quantityType)を使用して、収集されたデータに基づいて何らかの処理(例えば、ユーザーインターフェースの更新)を行うことが一般的