2017-10-30 30 views
0

私はHealthkitから心拍情報を取得しようとしています。HealthStoreから心拍数を読み取る

私のプロフィールには心拍数のデータがあります。ここで

は私のクエリです:

private func createStreamingQuery() -> HKQuery { 
    let predicate = HKQuery.predicateForSamples(withStart: NSDate() as Date, end: nil, options: []) 

    let query = HKAnchoredObjectQuery(type: heartRateType, predicate: predicate, anchor: nil, limit: Int(HKObjectQueryNoLimit)) { 
     (query, samples, deletedObjects, anchor, error) -> Void in 

     self.formatSamples(samples: samples) 

    } 

    query.updateHandler = { (query, samples, deletedObjects, anchor, error) -> Void in 
     self.formatSamples(samples: samples) 
    } 

    return query 
} 

そして今、私の関数形式のサンプル:

private func formatSamples(samples: [HKSample]?) { 
    guard let heartRateSamples = samples as? [HKQuantitySample] else { return } 

     guard let sample = heartRateSamples.first else{return} 
     let value = sample.quantity.doubleValue(for: self.heartRateUnit) 

     print("HeartRate: \(value)") 
} 

は、私はすでにデバッグと私が見つかりました。「formatSamples」のコードの最初の行では、リストのこと"サンプル"には多くの値があります。

guard let heartRateSamples = samples as? [HKQuantitySample] else { return } 

このリストの最初の値を取得しようとすると、突然私の李stは空であり、関数を終了します。 Here->

guard let sample = heartRateSamples.first else{return} 

サンプルリストは、次のいずれかに1つのラインから、それ自体で空に、なぜ私は理解していません。

クエリが実行されます。

@IBAction func readHeartRate(_ sender: Any) { 
    self.healthStore.execute(self.createStreamingQuery()) 
} 

私を助けてくれますか?

答えて

0

問題は私の述語が間違っていました。

ここでは、私が使用した正しい述語の例です。結果は過去7日間に制限されます。

let calendar = NSCalendar.current; 
let now = NSDate(); 
let sevenDaysAgo = calendar.date(byAdding: .day, value: -7, to: now as Date); 
let startDate = calendar.startOfDay(for: sevenDaysAgo!); 

let predicate = HKQuery.predicateForSamples(withStart: startDate as Date, end: now as Date, options: []) 
関連する問題