2015-06-16 41 views
1

我正在處理我的第一個iPhone應用程序:一個簡單的應用程序,以良好的方式顯示HealthKit的heartRate結果。我的第一步是將結果顯示爲原始文本。但不幸的是,我在下面一行發現異常,告訴我:「線程1信號SIGABRT」。有人知道,我做錯了什麼,並在一個方向上暗示我?嘗試從HealthKitStore轉換HeartRate時發生異常

double usersBeatsPerMinute = [quantity doubleValueForUnit:[HKUnit countUnit]]; 

的代碼的其餘部分是這樣的:

- (void)viewDidLoad { 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
// Set up an HKHealthStore, asking the user for read/write permissions. The profile view controller is the 
// first view controller that's shown to the user, so we'll ask for all of the desired HealthKit permissions now. 
// In your own app, you should consider requesting permissions the first time a user wants to interact with 
// HealthKit data. 
if ([HKHealthStore isHealthDataAvailable]) { 
    NSSet *writeDataTypes = [self dataTypesToWrite]; 
    NSSet *readDataTypes = [self dataTypesToRead]; 

    [self.healthStore requestAuthorizationToShareTypes:writeDataTypes readTypes:readDataTypes completion:^(BOOL success, NSError *error) { 
     if (!success) { 
      NSLog(@"You didn't allow HealthKit to access these read/write data types. In your app, try to handle this error gracefully when a user decides not to provide access. The error was: %@. If you're using a simulator, try it on a device.", error); 

      return; 
     } 

    }]; 
} 

HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate]; 

// Since we are interested in retrieving the user's latest sample 
// we sort the samples in descending order by end date 
// and set the limit to 1 
// We are not filtering the data, and so the predicate is set to nil. 
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO]; 

// construct the query & since we are not filtering the data the predicate is set to nil 
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:weightType predicate:nil limit:1 sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) { 

    // if there is a data point, dispatch to the main queue 
    if (results) { 
     dispatch_async(dispatch_get_main_queue(), ^{ 
      HKQuantitySample *quantitySample = results.firstObject; 

      // pull out the quantity from the sample 
      HKQuantity *quantity = quantitySample.quantity; 

      double usersBeatsPerMinute = [quantity doubleValueForUnit:[HKUnit countUnit]]; 
      _HeartRateResults.text = [NSString stringWithFormat:@"%@ lbs", [NSNumberFormatter localizedStringFromNumber:@(usersBeatsPerMinute) numberStyle:NSNumberFormatterNoStyle]]; 
     }); 
    } 
}]; 

// do not forget to execute the query after its constructed 
[_healthStore executeQuery:query];} 
+1

檢查數量是否首先兼容。 '[quantity isCompatibleWithUnit:[HKUnit countUnit]];' –

+0

試一試。感謝您的快速響應 – Jonathan

+0

已將代碼更改爲此,現在它不會崩潰,但它不顯示hearRate ether: 'bool compatibilityQuantityAndCountUnit = [quantity isCompatibleWithUnit:[HKUnit countUnit]]; if(compatibilityQuantityAndCountUnit)double usersBeatsPerMinute = [quantity doubleValueForUnit:[HKUnit countUnit]]; _HeartRateResults.text = [NSString stringWithFormat:@「%@ lbs」,[NSNumberFormatter localizedStringFromNumber:@(usersBeatsPerMinute)numberStyle:NSNumberFormatterNoStyle]];}' – Jonathan

回答

3

有在documentation評論(「這些樣品使用次數/時間單位」)我不明白,所以我做了一些搜索,並試圖出來,並能得到我手動投入使用此生應用程序的值:

double rate = [mostRecentQuantity doubleValueForUnit:[[HKUnit countUnit] unitDividedByUnit:[HKUnit minuteUnit]]]; 

我以前沒有見過unitDividedByUnit。這裏是the article我把它從中拉出來。

+0

這工作。不知道如果沒有你的帖子我會怎麼想。非常感謝! – Hivebrain

相關問題