У меня есть этот код, который пытается сделать фоновый выбор для данных HealthKit. Код работает нормально, когда я впервые запускаю приложение, но если я вручную выполняю фоновый выбор (используя команду debug), я получаю исключение и ошибку, которая говорит reason: 'this request has been neutered - you can't call -sendResponse: twice nor after encoding it'
, и я не совсем уверен, почему.NSInternalInconsistencyException при запуске фоновой выборки с помощью цикла
Вот код, который извлекает данные:
- (void)fetchNewDataWithCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
if (!self.healthStore) {
self.healthStore = [HKHealthStore new];
}
dataTypes = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:1], HKQuantityTypeIdentifierStepCount,
[NSNumber numberWithInt:2], HKQuantityTypeIdentifierFlightsClimbed,
[NSNumber numberWithInt:3], HKQuantityTypeIdentifierDistanceWalkingRunning,
[NSNumber numberWithInt:4], HKQuantityTypeIdentifierDistanceCycling, nil];
achievementData = [NSMutableDictionary new];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDate *startDate = [calendar startOfDayForDate:[NSDate date]];
NSDate *endDate = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:startDate options:0];
NSPredicate *predicate = [HKQuery predicateForSamplesWithStartDate:startDate endDate:endDate options:HKQueryOptionNone];
for (NSString *key in dataTypes) {
HKSampleType *sampleType = [HKSampleType quantityTypeForIdentifier:key];
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:sampleType predicate:predicate limit:HKObjectQueryNoLimit sortDescriptors:nil resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
if (!error) {
if (!results) {
NSLog(@"No results were returned form query");
completionHandler(UIBackgroundFetchResultNoData);
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self processNewDataWithResults:results andType:key];
completionHandler(UIBackgroundFetchResultNewData);
});
}
} else {
NSLog(@"Error: %@ %@", error, [error userInfo]);
completionHandler(UIBackgroundFetchResultFailed);
}
}];
[self.healthStore executeQuery:query];
}
}
Тогда у меня есть отдельная функция, которая обрабатывает данные, которые вы можете увидеть вызывается, когда найдены результаты. Если вы хотите, я могу вставить его здесь, но он довольно длинный, не уверен, что он имеет какое-либо отношение к нему.
Я попытался поставить точки останова, чтобы увидеть, когда вызван обработчик завершения, но из того, что я могу сказать, это вызов только один раз, если только мне не хватает чего-то глупого здесь.
Если у кого-нибудь есть какие-либо советы, пожалуйста, дайте мне знать :) Спасибо!
EDIT Вот что сообщение об ошибке выглядит следующим образом:
2015-05-13 10:11:54.467 appName[379:169163] *** Assertion failure in -[UIFetchContentInBackgroundAction sendResponse:], /SourceCache/BaseBoard/BaseBoard-98.3/BaseBoard/BSAction.m:221
2015-05-13 10:11:54.470 appName[379:169163] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'this request has been neutered - you can't call -sendResponse: twice nor after encoding it'
*** First throw call stack:
(0x28ed4137 0x36e30c77 0x28ed400d 0x29bd2bc9 0x2dbde865 0x397ed5 0x2dbde7cf 0x2ca82a3d 0x39019b 0x390187 0x393e9d 0x28e99889 0x28e97fa9 0x28de39a1 0x28de37b3 0x305951a9 0x2c56e695 0xdff29 0x373d8aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException
Вы знаете, есть ли способ, по которому я могу вывести обработчик завершения из цикла или, возможно, получить данные по-другому? Благодаря! –
В основном вам нужен способ запускать запросы, получать их соответствующие результаты и вызывать обработчик завершения один раз после * все * результаты возвращаются. Существует несколько способов сделать это, например, используя NSOperationQueues или GCD. Я исправлю ответ с помощью некоторого кода, основанного на группах отправки, которые должны указывать вам в правильном направлении. – mvanallen
Это замечательный материал, я не слишком много перепутал с GCD, за исключением того, что я нашел для руководства по запросам Healthkit. Я сделаю это, я должен буду больше исследовать GCD и как все это входит, чтобы поиграть, чтобы узнать больше об этом. Еще раз спасибо! –