Как извлечь сегодняшние памятные минуты из HealthKit? - PullRequest
0 голосов
/ 29 сентября 2019

Я пытаюсь получить сегодняшние памятные минуты из HealthKit, но я всегда получаю 44280 вместо 3, как в приложении для здоровья, я написал эту функцию:

func getDailyMindfulnessTime(completion: @escaping (TimeInterval) -> Void) {

            let sampleType = HKSampleType.categoryType(forIdentifier: .mindfulSession)!
            let sortDescriptor = NSSortDescriptor(key: HKSampleSortIdentifierEndDate, ascending: false)
            let startDate = Calendar.current.startOfDay(for: Date())
            let endDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate)
            let predicate = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: .strictStartDate)

            let query = HKSampleQuery(sampleType: sampleType, predicate: predicate, limit: HKObjectQueryNoLimit, sortDescriptors: [sortDescriptor]) { (_, results, error) in
                if error != nil {
                    print(" HealthKit returned error while trying to query today's mindful sessions. The error was: \(error?.localizedDescription)")
                }
                var totalTime = TimeInterval()
                if let results = results {
                    for result in results {
                        totalTime = result.endDate.timeIntervalSince(startDate)
                        completion(totalTime)
                    }
                } else {
                    completion(0)
                }
            }
            healthStore.execute(query)

        }

}

Что мне делать?

1 Ответ

0 голосов
/ 29 сентября 2019

Когда вы складываете время, вы используете этот код:

if let results = results {
    for result in results {
        totalTime = result.endDate.timeIntervalSince(startDate)
        completion(totalTime)
    }
} else {
    completion(0)
}

Однако он не делает то, что вы думаете.Есть две основные проблемы:

  1. Вместо того, чтобы определять продолжительность сеанса, вы получаете время с конца сеанса с начала дня.Чтобы исправить это, используйте totalTime = result.endDate.timeIntervalSince(result.startDate)
  2. Другая проблема, которую я вижу, заключается в том, что вы звоните completion с продолжительностью каждого сеанса, не общее время .Это может быть тем, что вы хотите, но если это не так, измените внутреннюю часть вашего запроса следующим образом:
if error != nil {
    print(" HealthKit returned error while trying to query today's mindful sessions. The error was: \(error?.localizedDescription)")
}
if let results = results {
    var totalTime = TimeInterval()
    for result in results {
        totalTime += result.endDate.timeIntervalSince(result.startDate)
    }
    completion(totalTime)
} else {
    completion(0)
}

Это суммирует все сеансы перед вызовом обработчика завершения.

Надеюсь, это поможет!

...