Я застрял, пытаясь понять, как использовать составные предикаты для фильтрации данных .asleep из HealthKit. У меня есть базовое c понимание составных предикатов, но я не могу настроить его для запроса только .asleep в анализе сна. Вот что у меня есть:
func readSleep(date: Date) {
guard let sleep = HKSampleType.categoryType(forIdentifier: .sleepAnalysis) else {
print("Sample type not available")
return
}
let startDate = convertSleepStartDate(StartDate: date)
let endDate = convertSleepEndDate(EndDate: date)
let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)
// let asleepPredicate = HKQuery.predicateForCategorySamples(with: <#T##NSComparisonPredicate.Operator#>, value: <#T##Int#>)
// let compound:NSCompoundPredicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate, asleepPredicate])
let sleepQuery = HKSampleQuery(sampleType: sleep,
predicate: predicate,
limit: HKObjectQueryNoLimit,
sortDescriptors: nil) {
(query, samples, error) in
guard
error == nil,
samples == samples as? [HKCategorySample] else {
print("Something went wrong getting sleep: \(String(describing: error))")
return
}
if let result = samples {
result
.compactMap({ $0 as? HKCategorySample})
.forEach({ sample in
guard let sleepValue = HKCategoryValueSleepAnalysis(rawValue: sample.value) else {
return
}
let isAsleep = sleepValue == .asleep
if isAsleep == true {
let total = samples?.map(self.calculateSleepHours(sample:)).reduce(0, {$0 + $1}) ?? 0
DispatchQueue.main.async {
self.userSleepHours = total / 60 / 2
}
} else {
return
}
})
}
}
HKHealthStore().execute(sleepQuery)
}
Я уже некоторое время размышляю над этой проблемой, и если вы можете дать какие-то рекомендации, я буду очень признателен.