Можете ли вы получить разные источники HKQuantity вместе? - PullRequest
0 голосов
/ 31 марта 2020

Как заявление об отказе от ответственности, я новичок в 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
...