Swift 2.0:读取 HealthKit HeartRate 数据 - 在展开 Optional 时意外发现 nil
Swift 2.0: Reading HealthKit HeartRate Data - unexpectedly found nil while unwrapping an Optional
我正在尝试对 HealthKit 中的心率数据进行统计查询。
下面的代码可以编译,但在函数调用时会导致以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
错误发生在这一行:
let quantity : HKQuantity = result!.averageQuantity()!;
为什么结果返回零?我已经验证 HealthKit 中有 Heart Rate 数据,所以我不相信这是因为查询中的数据不存在。
有什么想法吗?有一个更好的方法吗?
代码如下:
func readHeartRate() {
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!
let nowDate = NSDate()
let calendar = NSCalendar.autoupdatingCurrentCalendar()
let yearMonthDay: NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day]
let components: NSDateComponents = calendar.components(yearMonthDay , fromDate: nowDate)
let beginOfDay : NSDate = calendar.dateFromComponents(components)!
let predicate : NSPredicate = HKQuery.predicateForSamplesWithStartDate(beginOfDay, endDate: nowDate, options: HKQueryOptions.StrictStartDate)
let squery = HKStatisticsQuery(quantityType: sampleType, quantitySamplePredicate: predicate, options: HKStatisticsOptions.None, completionHandler: { (squery, result, error) -> Void in
dispatch_async( dispatch_get_main_queue(), { () -> Void in
let quantity : HKQuantity = result!.averageQuantity()!;
let beats : Double = quantity.doubleValueForUnit(self.heartRateUnit)
print(beats)
})
})
healthKitStore.executeQuery(squery)
}
result
参数不保证为非零。如果结果不是 nil,你应该只解包并使用它,否则检查 error
看看哪里出了问题。您可能会发生许多您无法控制的错误(例如,设备可能在处理您的查询时被锁定,或者执行查询的系统守护程序可能崩溃)。
我最终在这里采用了不同的方法,并且能够通过查询一组心率数据并取平均值来手动解决问题。
注意:getDayofWeek 函数只需要一个 NSDate 和 returns 一个表示星期几的字符串。
func readHRbyDate(latestXSamples: Int, startDate: NSDate, endDate: NSDate, completion: (((String, CGFloat), NSError!) -> Void)!)
{
let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.None)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true)
var HRdata:(String,CGFloat) = ("N/A",0)
var bpm: Int = 0
var totalBPMforDay = [Int]()
var BPMCount: Int = 0
var sumBPM: Int = 0
let query = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: latestXSamples, sortDescriptors: [sortDescriptor])
{ (query, results, error) in
if let queryError = error {
print("Problem fetching HR data")
completion(("nil",0.0),queryError)
return
}else{
for result in results! {
bpm = Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)
totalBPMforDay += [Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)]
BPMCount = Int(totalBPMforDay.count)
sumBPM += Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)
let HRAvg = sumBPM / BPMCount
HRdata = (self.getDayOfWeek(result.startDate),CGFloat(HRAvg))
}
if completion != nil {
completion(HRdata,nil)
}
}
}
healthKitStore.executeQuery(query)
}
我正在尝试对 HealthKit 中的心率数据进行统计查询。
下面的代码可以编译,但在函数调用时会导致以下错误:
fatal error: unexpectedly found nil while unwrapping an Optional value
错误发生在这一行:
let quantity : HKQuantity = result!.averageQuantity()!;
为什么结果返回零?我已经验证 HealthKit 中有 Heart Rate 数据,所以我不相信这是因为查询中的数据不存在。
有什么想法吗?有一个更好的方法吗?
代码如下:
func readHeartRate() {
let sampleType = HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)!
let nowDate = NSDate()
let calendar = NSCalendar.autoupdatingCurrentCalendar()
let yearMonthDay: NSCalendarUnit = [NSCalendarUnit.Year, NSCalendarUnit.Month, NSCalendarUnit.Day]
let components: NSDateComponents = calendar.components(yearMonthDay , fromDate: nowDate)
let beginOfDay : NSDate = calendar.dateFromComponents(components)!
let predicate : NSPredicate = HKQuery.predicateForSamplesWithStartDate(beginOfDay, endDate: nowDate, options: HKQueryOptions.StrictStartDate)
let squery = HKStatisticsQuery(quantityType: sampleType, quantitySamplePredicate: predicate, options: HKStatisticsOptions.None, completionHandler: { (squery, result, error) -> Void in
dispatch_async( dispatch_get_main_queue(), { () -> Void in
let quantity : HKQuantity = result!.averageQuantity()!;
let beats : Double = quantity.doubleValueForUnit(self.heartRateUnit)
print(beats)
})
})
healthKitStore.executeQuery(squery)
}
result
参数不保证为非零。如果结果不是 nil,你应该只解包并使用它,否则检查 error
看看哪里出了问题。您可能会发生许多您无法控制的错误(例如,设备可能在处理您的查询时被锁定,或者执行查询的系统守护程序可能崩溃)。
我最终在这里采用了不同的方法,并且能够通过查询一组心率数据并取平均值来手动解决问题。
注意:getDayofWeek 函数只需要一个 NSDate 和 returns 一个表示星期几的字符串。
func readHRbyDate(latestXSamples: Int, startDate: NSDate, endDate: NSDate, completion: (((String, CGFloat), NSError!) -> Void)!)
{
let sampleType = HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierHeartRate)
let predicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate: endDate, options: HKQueryOptions.None)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: true)
var HRdata:(String,CGFloat) = ("N/A",0)
var bpm: Int = 0
var totalBPMforDay = [Int]()
var BPMCount: Int = 0
var sumBPM: Int = 0
let query = HKSampleQuery(sampleType: sampleType!, predicate: predicate, limit: latestXSamples, sortDescriptors: [sortDescriptor])
{ (query, results, error) in
if let queryError = error {
print("Problem fetching HR data")
completion(("nil",0.0),queryError)
return
}else{
for result in results! {
bpm = Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)
totalBPMforDay += [Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)]
BPMCount = Int(totalBPMforDay.count)
sumBPM += Int(((result.valueForKeyPath("_quantity._value"))?.floatValue)! * 60.0)
let HRAvg = sumBPM / BPMCount
HRdata = (self.getDayOfWeek(result.startDate),CGFloat(HRAvg))
}
if completion != nil {
completion(HRdata,nil)
}
}
}
healthKitStore.executeQuery(query)
}