Как заявление об отказе от ответственности, я новичок в swift и в основном полагаюсь на другой опыт программирования. Я работаю над приложением, которое предсказывает падение уровня глюкозы в крови диабета 1 типа c после тренировки. Это требует ввода нескольких разных количеств Healthkit, в том числе активных калорий, инсулина и глюкозы в крови, но у меня были проблемы с получением этих количеств для выполнения математических операций с ними в одном и том же месте. Я работаю над созданием SpeedySloth, примера приложения для тренировок Apple, и вот как они получают данные Healthkit:
case HKQuantityType.quantityType(forIdentifier: .heartRate):
/// - Tag: SetLabel
let heartRateUnit = HKUnit.count().unitDivided(by: HKUnit.minute())
let value = statistics.mostRecentQuantity()?.doubleValue(for: heartRateUnit)
let roundedValue = Double( round( 1 * value! ) / 1 )
label.setText("\(roundedValue) BPM")
case HKQuantityType.quantityType(forIdentifier: .activeEnergyBurned):
let energyUnit = HKUnit.kilocalorie()
let value = statistics.sumQuantity()?.doubleValue(for: energyUnit)
let roundedValue = Double( round( 1 * value! ) / 1 )
label.setText("\(roundedValue) cal\n")
Как видите, новый случай создается каждый раз, когда вызывается количество, и каждый называется отдельно. Тем не менее, есть ли способ вызвать их вместе или несколько одновременно, чтобы я мог работать с количествами? Я попробовал другие методы, в том числе предикат в одном из случаев, но, похоже, это не сработало. Будем благодарны за любые предложения.
Поскольку вы не можете запрашивать несколько количеств в одном запросе, возможно ли вложить запрос предиката в отзыв количества, чтобы я мог работать с обеими переменными? Вот то, что я пытался поместить предикатный запрос в регистр активной энергии:
let energyUnit = HKUnit.kilocalorie()
let value = statistics.sumQuantity()?.doubleValue(for: energyUnit)
let roundedValue = Double( round( 1 * value! ) / 1 )
let quantityType = HKObjectType.quantityType(forIdentifier:(HKQuantityTypeIdentifier.bloodGlucose))
let mostRecentPredicate = HKQuery.predicateForSamples(withStart: Date.distantPast,
end: Date(),
options: .strictEndDate)
let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierStartDate,
ascending: false)
let limit = 1
let sampleQuery = HKSampleQuery(sampleType: quantityType!,
predicate: mostRecentPredicate,
limit: limit,
sortDescriptors: [sortDescriptor]) { (query, samples, error) in
let sample = samples?.first as? HKQuantitySample
let BG = sample?.quantity
let ESF = 0.125
let TotBGChg = -1 * ESF * roundedValue
let roundedTBGC = round(TotBGChg)
label.setText("\(roundedValue) cal\n\(String(describing: BG)) mg/dL")
}
return