2015-09-20 4 views
3

Я пытаюсь получить статистический запрос данных Heart Rate в HealthKit.Swift 2.0: Чтение HealthKit HeartRate Data - неожиданно найдено нуль во время разворачивания необязательного

Ниже код компилируется, но приводит к следующей ошибке При вызове функции:

fatal error: unexpectedly found nil while unwrapping an Optional value

Ошибка происходит на этой линии:

let quantity : HKQuantity = result!.averageQuantity()!;

Почему результат возвращающего ноль? Я подтвердил, что данные Heart Rate доступны в 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) 
} 
+0

Вы посмотрели на 'error'? – jtbandes

+0

Ошибка возникает, потому что «результат» равен нулю. Мой вопрос: почему запрос возвращает нуль, когда должны быть данные? – 0000101010

+1

Правильно, но есть параметр 'error', который должен рассказать вам, что происходит. – jtbandes

ответ

0

В итоге я решил использовать другой подход и смог решить проблему вручную, запросив набор данных о сердечном ритме и принимая среднее значение.

Примечание: Функция 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) 
} 
1

Параметр result не гарантируется быть не равна нулю. Вы должны только разворачивать и использовать результат, если он не равен нулю, и в противном случае проверить error, чтобы узнать, что пошло не так. Существует ряд ошибок, которые вы могли бы ожидать, которые находятся вне вашего контроля (например, устройство может блокироваться при обработке вашего запроса или демон системы, выполняющий запрос, может привести к сбою).

+0

Хорошая точка. Я пытаюсь добавить обработчик завершения и посмотреть, могу ли я поймать, что происходит. – 0000101010

Смежные вопросы

 Смежные вопросы