【HealthKit】Swift Concurrencyを用いたQueryを実行する-サンプルコードあり-
はじめに
公式ドキュメントを参考にして記載しています。実装する中で理解できなかった部分・詰まった部分がありましたので、作成したサンプルコードを示しながら共有していきます。
Swift Concurrencyを用いたQuery
HealthKitは、Swift Concurrencyを使用してHealthKitStoreからデータをクエリするためのAPIを提供します。このAPIは、1回限りのクエリ(One-Shot Query)を実行するHKAsyncQuery
プロトコルと、継続的なデータ更新を監視するクエリ(Long-Running Queries)を実行するHKAsyncSequenceQuery
プロトコルの2つのプロトコルを使用します。
QueryDescriptorの設定
すべてのクエリにおいて、最初に取得したいデータに対するサンプルタイプと条件を設定します。以下のコードは、歩数のサンプルタイプを作成し、過去1週間以内に保存されたサンプルを取得するための条件を作成します。
大量のデータをHealthKitStoreに保存している場合、すべてのサンプルを呼び出すことは非常に高コストとなるため、結果数を制限するか、特定の日付範囲に制限する必要があります。
次に、QueryDescriptor
を作成します。以下の例では、指定したアンカーより後に追加された歩数を検索し、過去1週間以内のサンプルを対象としています。
このQueryDescriptor
を使用してクエリを実行できます。
One-Shot Queryの実行
HKAsyncQuery
プロトコルを採用したQueryDescriptor
は、1回限りのクエリを実行できます。result(for:)
メソッドを呼び出してクエリを開始します。以下のコードは、One-Shot Query
を実行し、結果を処理する例です。
Long-Running Queriesの実行と停止
HKAsyncSequenceQuery
プロトコルを採用したQueryDescriptor
は、HealthKitStoreを監視し、データが更新されるたびに結果を返すLong-Running Queriesを作成できます。以下のコードは、継続的な更新データを取得する例です。
Task
でfor
ループをラップすることで、タスクをキャンセルしてLong-Running Queriesを停止できます。以下のコードでLong-Running Queriesを停止できます。
どのQueryを選択すべきか
One-Shot Queryを採用しているQueryDescriptor
は、HKAsyncQuery
のConforming Types
セクションを参照してください。
Long-Running Queriesを採用しているQueryDescriptor
は、HKAsyncSequenceQuery
のConforming Types
セクションを参照してください。
実装コードの動作確認
最後に実装したコードを用いた、One-ShotQuery・Long-Running Queriesがどのような挙動をするかを振り返って終わります。Textでログ出力をしているので、動画を参考にしながら動作確認いただきたいです。
動作確認手順としては、
- 歩数を保存する
- 歩数を削除する
- One-Shot Queryを実行
- 歩数を保存する
- 歩数を削除する
- Long-Running Queriesを実行
- 歩数を保存する
- 歩数を削除する
- Long-Running Queriesを停止
- 歩数を保存する
- 歩数を削除する
3.ではデータ変更の監視はされておらず、6.により監視が開始し、9.により監視が中止されます。
以下は今回使用したサンプルコードになります。
最後に
間違い・気になる部分がありましたら、コメントいただけると大変うれしいです。
良かったと思ったら記事へのいいね、Xのフォローをよろしくお願いいたします。🙇
個人でアプリを作成しています。良かったら覗いてみてください。˝
Discussion