swift - 如何从 HealthKit 检索今天的正念分钟数?

标签 swift healthkit

我试图从 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)

        }

}

我应该做什么?

最佳答案

当您添加时间时,您可以使用以下代码:

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

然而,它并没有按照你的想法去做。它有两个主要问题:

  1. 您获取的不是 session 的长度,而是从 session 结束到当天开始的时间。要解决此问题,请使用 totalTime = result.endDate.timeIntervalSince(result.startDate)
  2. 我发现的另一个问题是,您调用完成 时使用的是每个 session 的长度,而不是总时间。这可能是您想要的,但如果不是,请将查询内部更改为:
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)
}

这将在调用完成处理程序之前对所有 session 进行求和。

希望这有帮助!

关于swift - 如何从 HealthKit 检索今天的正念分钟数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58154034/

相关文章:

ios - Swift WebViews 没有按预期工作

iOS 图表,Swift 2.1.1 Xcode 7.2 似乎不起作用,

ios - Apple Healthkit 和 Watch 模拟器

ios - 如何从 HealthKit 获取元数据?

ios - AsyncDisplayKit invalidateCalculatedSize Swift 不工作

swift - Facebook 登录不会在登录后关闭登录对话框

通过 Testflight 存档和安装应用程序时,iOS Firebase crashlytics 仪表板不会显示崩溃

swift - HealthKit 通过 "Date Added to Health"搜索样本

ios - 如何防止在 HealthKit 中写入重复数据?

swift - 如何为 liter() 类型的 HKUnit 读取和写入数据?