如何从 HealthKit 获取每小时的步数 Swift 4
How to get steps count on hourly basis from HealthKit Swift 4
我需要绘制用户在任何特定日期每小时所走步数的图表。但是,如果用户的步数从今天下午 3:58 开始,到今天下午 4:10 结束,那么这段时间我只会得到一个 HKStatistics 对象。我无法将此数据分成两个样本,因为我需要在下午 3-4 点时段和下午 4-5 点时段采取步骤。
static func getSteps(date: Date, duration: DateComponents, completion: @escaping ([HKSample]) -> Void) {
let quantityType : Set = [HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!]
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startOfDay = Calendar.current.startOfDay(for: date)
if let endOfDay = Calendar.current.date(byAdding: duration, to: startOfDay) {
var interval = DateComponents()
interval.hour = 1
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: endOfDay, options: .strictStartDate)
let query = HKSampleQuery.init(sampleType:stepsQuantityType,
predicate: predicate,
limit: HKObjectQueryNoLimit,
sortDescriptors: nil,
resultsHandler: { (query, results, error) in
guard let result = results else {
return
}
// print("result healthkit",result.description)
//print("Total count:",)
completion(result)
})
healthStore.execute(query)
}
}
你是对的,你不能分割样本。这是所有可用的信息。步骤不是一步一步存储的;它们被聚合成块以减少功率和存储需求(主要是功率;在硬件中累积一个值并定期读取它比每次检测到一个步骤都查询实时时钟更容易)。
为了完成您正在讨论的内容,您需要对这段时间的步数进行平均。因此,如果在 3:58p 到 4:07p 期间有 100 步,则平均为 10 steps/minute,您将向 3p-4p 块分配 20 步,向 4p-5p 分配 80 步堵塞。这是你拥有的最好的信息。
不要使用 HKSampleQuery
绘制数量类型。 HKStatisticsCollectionQuery
就是为此目的而设计的,它将为您拆分落入图表不同区域的样本。有关如何构建查询和使用其结果的示例,请参阅 documentation。
我需要绘制用户在任何特定日期每小时所走步数的图表。但是,如果用户的步数从今天下午 3:58 开始,到今天下午 4:10 结束,那么这段时间我只会得到一个 HKStatistics 对象。我无法将此数据分成两个样本,因为我需要在下午 3-4 点时段和下午 4-5 点时段采取步骤。
static func getSteps(date: Date, duration: DateComponents, completion: @escaping ([HKSample]) -> Void) {
let quantityType : Set = [HKObjectType.quantityType(forIdentifier: HKQuantityTypeIdentifier.stepCount)!]
let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!
let startOfDay = Calendar.current.startOfDay(for: date)
if let endOfDay = Calendar.current.date(byAdding: duration, to: startOfDay) {
var interval = DateComponents()
interval.hour = 1
let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: endOfDay, options: .strictStartDate)
let query = HKSampleQuery.init(sampleType:stepsQuantityType,
predicate: predicate,
limit: HKObjectQueryNoLimit,
sortDescriptors: nil,
resultsHandler: { (query, results, error) in
guard let result = results else {
return
}
// print("result healthkit",result.description)
//print("Total count:",)
completion(result)
})
healthStore.execute(query)
}
}
你是对的,你不能分割样本。这是所有可用的信息。步骤不是一步一步存储的;它们被聚合成块以减少功率和存储需求(主要是功率;在硬件中累积一个值并定期读取它比每次检测到一个步骤都查询实时时钟更容易)。
为了完成您正在讨论的内容,您需要对这段时间的步数进行平均。因此,如果在 3:58p 到 4:07p 期间有 100 步,则平均为 10 steps/minute,您将向 3p-4p 块分配 20 步,向 4p-5p 分配 80 步堵塞。这是你拥有的最好的信息。
不要使用 HKSampleQuery
绘制数量类型。 HKStatisticsCollectionQuery
就是为此目的而设计的,它将为您拆分落入图表不同区域的样本。有关如何构建查询和使用其结果的示例,请参阅 documentation。