2016-04-03 33 views
0

HKAnchoredObjectQueryの仕組みを理解しようとしています。ワークアウトが開始され、ワー​​クアウトセッションの状態が実行中に変わると、次の関数を呼び出してクエリを実行し、ハートビート値を取得します。なぜHKSample配列には、HKAnchoredObjectQueryの値が1つでもなく、述語もアンカーもありません。

func createHeartRateStreamingQuery() { 

    guard let quantityType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate) else { return nil } 

    var heartRateQuery : HKAnchoredObjectQuery? = HKAnchoredObjectQuery(type: quantityType, predicate: nil, anchor: nil, limit: Int(HKObjectQueryNoLimit)) { (query, sampleObjects, deletedObjects, newAnchor, error) -> Void in 

    } 

    heartRateQuery!.updateHandler = {(query, samples, deleteObjects, newAnchor, error) -> Void in 
     { 
      //Samples only have 1 entry which is the most recent reading. 
     } 
    } 

    self.healthStore.executeQuery(heartRateQuery!) 

} 

HeartRateQueryの更新ハンドラが完了ハンドラ内のすべての2〜3秒とサンプル変数が最新の読みである心拍数のわずか1読書をしていると呼ばれています。クエリに制限、述語、またはアンカーを設定していないので、ワークアウトが開始されて以来、心拍数の読み取り値をすべて受け取ってはいけませんか?

答えて

1

表示されている動作が必要です。 updateHandlerは、ハンドラが最後に呼び出されて以来、新しいサンプルでのみ呼び出されます。ワークアウト中に記録されたサンプルを追跡したい場合は、ハンドラが呼び出されるたびにそれらを配列に追加する必要があります。

述語を使用していないため、初期結果ブロックには、ワークアウトセッション中に記録されたサンプルだけでなく、現在HealthKitで使用可能なすべての心拍サンプルが含まれます。

+0

はい、私は更新ハンドラが最近のエントリを返すだけで、初期結果ブロックにすべての心拍数サンプルが含まれることに気付きました。日付の代わりに、私は今、最後の更新ハンドラから取得したアンカーを使用して、アプリケーションが中断されている間に記録されたすべてのサンプルを取得しています –

関連する問題