Я пытаюсь выяснить, как мне удается установить блок completion
внутри HKStatisticsCollectoniQuery
.
Вся идея в этом заключается в том, что я хочу знать, принял ли пользователь разрешения на выборку для шагов экземпляра. Но, согласно документации Apple, это невозможно.
Документация Apple для Состояние авторизации (для:)
Этот метод проверяет статус авторизации для сохранения данных.
Чтобы предотвратить возможные утечки конфиденциальной информации о состоянии здоровья, ваше приложение не может определить, предоставил ли пользователь разрешение на чтение данных. Если вам не дано разрешение, это просто выглядит так, как будто нет данных запрошенный тип в магазине HealthKit. Если вашему приложению предоставлено разрешение на общий доступ, но нет разрешения на чтение, вы увидите только те данные, которые ваше приложение записало в магазин. Данные из других источников остаются скрытыми.
Поэтому я думал о том, чтобы выбрать шаги между интервалами с января 2014 года до сегодняшнего дня. И посмотрите, равно ли это значение 0
, что может означать две вещи. Или то, что пользователь не принял разрешение ... или что пользователь просто не прошел ни одного шага. Я не знаю, если это правильный подход. Так что, если есть лучший способ, я буду признателен за любой ответ!
Хорошо, пока я выполнил следующую функцию:
func retrieveTotalCount(typeIdentifier: HKQuantityTypeIdentifier, completion: @escaping (_ total: Double) -> Void) {
// Define the Step Quantity Type
let unitsCount = HKQuantityType.quantityType(forIdentifier: typeIdentifier)!
// "1391269654" stands for january 1st 2014
let initialDate = Date(timeIntervalSince1970: Double(1391269654))
// Set the Predicates & Interval
let predicate = HKQuery.predicateForSamples(withStart: initialDate, end: Date(), options: .strictStartDate)
var interval = DateComponents()
interval.day = 1
// Perform the Query
let query = HKStatisticsCollectionQuery(quantityType: unitsCount, quantitySamplePredicate: predicate, options: [.cumulativeSum], anchorDate: initialDate as Date, intervalComponents:interval)
query.initialResultsHandler = { query, results, error in
if error != nil {
// Something went Wrong
return
}
if let myResults = results {
myResults.enumerateStatistics(from: initialDate, to: Date()) { statistics, stop in
if let quantity = statistics.sumQuantity() {
if quantity.is(compatibleWith: HKUnit.meter()) {
let count = quantity.doubleValue(for: HKUnit.meter())
completion(count)
} else if quantity.is(compatibleWith: HKUnit.kilocalorie()) {
let count = quantity.doubleValue(for: HKUnit.kilocalorie())
completion(count)
} else {
let count = quantity.doubleValue(for: HKUnit.count())
completion(count)
}
}
}
}
}
self.healthStore.execute(query)
}
Всякий раз, когда я вызываю эту функцию, она дает мне многократные завершения только потому, что я просматриваю каждую статистику.
override func viewDidLoad() {
super.viewDidLoad()
var counter = 0
HealthKitManager.shared.retrieveTotalCount(typeIdentifier: .stepCount) { (count) in
counter += 1
print("Counter: \(counter)")
// In my case the Counter will print out:
// Counter: 1
// Counter: 2
// Counter: ...
// Counter: n
}
}
Как я могу убедиться, что блок завершения был завершен только один раз?