Проблемы с получением данных о частоте сердечных сокращений из HealthKit
В настоящее время у меня есть две записи сердечного ритма в начале этого года в январе, которые хранятся в моем приложении "Здоровье". В текущем приложении, которое я создаю, я предоставляю доступ для чтения и записи данных о частоте сердечных сокращений.
В моем viewDidAppear для одного из моих контроллеров просмотра я пытаюсь прочитать записи о частоте сердечных сокращений. Тем не менее, мне не удалось получить какие-либо данные.
Вот мой прочитанный код данных пульса:
+ (void)readHeartRateWithCompletion:(void (^)(NSArray *results, NSError *error))completion {
HKQuantityType *heartRateType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierHeartRate];
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierStartDate ascending:YES];
NSDate *lastSample = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastTsUploaded"];
if (!lastSample) {
lastSample = [NSDate dateWithTimeIntervalSinceNow:-24 * 60 * 60];
}
unsigned unitFlags = NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay;
NSDate *now = [NSDate date];
NSCalendar *gregorian = [NSCalendar currentCalendar];
NSDateComponents *comps = [gregorian components:unitFlags fromDate:now];
[comps setYear:[comps year] - 2];
NSDate *hundredYearsAgo = [gregorian dateFromComponents:comps];
NSPredicate *pred = [HKQuery predicateForSamplesWithStartDate:hundredYearsAgo endDate:[NSDate date] options:HKQueryOptionStrictStartDate];
HKSampleQuery *sampleQuery = [[HKSampleQuery alloc] initWithSampleType:heartRateType predicate:pred limit:10 sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
if (!results) {
NSLog(@"There are no heart rate results. The error was: %@.", error);
return;
}
}];
[[dcsContext sharedContext].healthStore executeQuery:sampleQuery];
}
Почему мой запрос не возвращает никаких данных?
1 ответ
Я, наконец, понял это после нескольких часов потянув за волосы, пытаясь понять, почему ни один из моих запросов не был выполнен. Я должен был добавить следующее перед всем моим кодом:
if ([HKHealthStore isHealthDataAvailable]) {
self.healthStore = [[HKHealthStore alloc] init];
// Rest of my code below
//get the heart rates
NSDate *now = [NSDate date];
NSCalendar *calendar = [NSCalendar autoupdatingCurrentCalendar];
NSDateComponents *components = [calendar components:NSCalendarUnitYear | NSCalendarUnitMonth | NSCalendarUnitDay fromDate:now];
...
Я также заменил свой [[dcs sharedContext].healthStore] другим экземпляром HealthStore, который я добавил как свойство в свой VC. Я превращу это в синглтон позже, как рекомендовано Apple, но пока это исправление работает.