Ios Swift 2.0:读取HealthKit心率数据-在展开可选数据包时意外发现零

Ios Swift 2.0:读取HealthKit心率数据-在展开可选数据包时意外发现零,ios,swift,healthkit,Ios,Swift,Healthkit,我正在尝试对HealthKit中的心率数据进行统计查询 以下代码已编译,但在调用函数时会导致以下错误: 致命错误:在展开可选值时意外发现nil 错误发生在这一行: let数量:HKQuantity=result!。平均数量() 为什么结果返回零?我已经证实HealthKit中有心率数据,所以我不相信这是因为查询中的数据不存在 有什么想法吗?有更好的方法吗 代码如下: func readHeartRate() { let sampleType = HKSampleType.quantity

我正在尝试对HealthKit中的心率数据进行统计查询

以下代码已编译,但在调用函数时会导致以下错误:

致命错误:在展开可选值时意外发现nil

错误发生在这一行:

let数量:HKQuantity=result!。平均数量()

为什么结果返回零?我已经证实HealthKit中有心率数据,所以我不相信这是因为查询中的数据不存在

有什么想法吗?有更好的方法吗

代码如下:

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)
}

结果
参数不能保证为非零。只有当结果不是nil时,您才应该展开并使用它,否则请检查
错误
,查看出了什么问题。可能会发生一些超出您控制范围的错误(例如,在处理查询时设备可能被锁定,或者执行查询的系统守护进程可能崩溃).

我在这里采用了不同的方法,通过手动查询一组心率数据并取平均值来解决问题

注意:getDayofWeek函数只接受NSDate并返回星期几的字符串

    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)
}

您是否查看了
错误
?发生错误是因为“结果”为零。我的问题是,当应该有数据时,为什么查询返回nil?是的,但是有一个
错误
参数应该告诉您发生了什么。这一点很好。我会尝试添加一个完成处理程序,看看是否能捕捉到发生的情况。