Составные предикаты - PullRequest
0 голосов
/ 07 мая 2020

Я застрял, пытаясь понять, как использовать составные предикаты для фильтрации данных .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)
    }

Я уже некоторое время размышляю над этой проблемой, и если вы можете дать какие-то рекомендации, я буду очень признателен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...