🩺

【HealthKit】Swift Concurrencyを用いたQueryを実行する-サンプルコードあり-

2024/05/27に公開

はじめに

公式ドキュメントを参考にして記載しています。実装する中で理解できなかった部分・詰まった部分がありましたので、作成したサンプルコードを示しながら共有していきます。

Swift Concurrencyを用いたQuery

HealthKitは、Swift Concurrencyを使用してHealthKitStoreからデータをクエリするためのAPIを提供します。このAPIは、1回限りのクエリ(One-Shot Query)を実行するHKAsyncQueryプロトコルと、継続的なデータ更新を監視するクエリ(Long-Running Queries)を実行するHKAsyncSequenceQueryプロトコルの2つのプロトコルを使用します。

QueryDescriptorの設定

すべてのクエリにおいて、最初に取得したいデータに対するサンプルタイプと条件を設定します。以下のコードは、歩数のサンプルタイプを作成し、過去1週間以内に保存されたサンプルを取得するための条件を作成します。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift#L127-L136

大量のデータをHealthKitStoreに保存している場合、すべてのサンプルを呼び出すことは非常に高コストとなるため、結果数を制限するか、特定の日付範囲に制限する必要があります。

次に、QueryDescriptorを作成します。以下の例では、指定したアンカーより後に追加された歩数を検索し、過去1週間以内のサンプルを対象としています。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift#L140-L143

このQueryDescriptorを使用してクエリを実行できます。

One-Shot Queryの実行

HKAsyncQueryプロトコルを採用したQueryDescriptorは、1回限りのクエリを実行できます。result(for:)メソッドを呼び出してクエリを開始します。以下のコードは、One-Shot Queryを実行し、結果を処理する例です。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift#L146-L159

Long-Running Queriesの実行と停止

HKAsyncSequenceQueryプロトコルを採用したQueryDescriptorは、HealthKitStoreを監視し、データが更新されるたびに結果を返すLong-Running Queriesを作成できます。以下のコードは、継続的な更新データを取得する例です。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift#L186-L200

Taskforループをラップすることで、タスクをキャンセルしてLong-Running Queriesを停止できます。以下のコードでLong-Running Queriesを停止できます。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift#L203-L206

どのQueryを選択すべきか

One-Shot Queryを採用しているQueryDescriptorは、HKAsyncQueryConforming Typesセクションを参照してください。
Long-Running Queriesを採用しているQueryDescriptorは、HKAsyncSequenceQueryConforming Typesセクションを参照してください。

実装コードの動作確認

最後に実装したコードを用いた、One-ShotQuery・Long-Running Queriesがどのような挙動をするかを振り返って終わります。Textでログ出力をしているので、動画を参考にしながら動作確認いただきたいです。

動作確認手順としては、

  1. 歩数を保存する
  2. 歩数を削除する
  3. One-Shot Queryを実行
  4. 歩数を保存する
  5. 歩数を削除する
  6. Long-Running Queriesを実行
  7. 歩数を保存する
  8. 歩数を削除する
  9. Long-Running Queriesを停止
  10. 歩数を保存する
  11. 歩数を削除する

3.ではデータ変更の監視はされておらず、6.により監視が開始し、9.により監視が中止されます。

以下は今回使用したサンプルコードになります。

https://github.com/muranakar/HealthKitSample/blob/main/HealthKitSample/View/13_HealthKitSwiftConcurrencyView.swift

最後に

間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら記事へのいいねXのフォローをよろしくお願いいたします。🙇

https://sites.google.com/view/muranakar

個人でアプリを作成しています。良かったら覗いてみてください。˝

Discussion