按日期排序 HealthKit 数据
Sorting HealthKit data by date
我正在尝试从 HealthKit 获取脉搏数据并按日期对它们进行排序以便在折线图中使用。我是 运行 a 'for loop' 以获得正确的日期并将结果放入数组中,然后再将结果放入图表中,但它们似乎是随机排列的,我不明白为什么。
class Pulse {
var pulse = 0.0
var startDate = Date()
}
var pulseData: [Pulse] = []
func getHeartBeatsForAWeek() {
for i in 1...7 {
getHeartBeats(startDate: date.getStartOfSpecificDateByAddingToToday(day: -i), endDate: date.getStartOfSpecificDateByAddingToToday(day: -i + 1))
}
}
func getHeartBeats(startDate: Date, endDate: Date) {
PulseHelper.shared.averageHearthRate(startDate: startDate, endDate: endDate) { (data) in
DispatchQueue.main.async {
self.pulseData.append(data)
self.updateGraph()
}
}
}
这是我获取心率的函数:
func averageHearthRate(startDate: Date, endDate: Date, completion: @escaping (Pulse) -> Void) {
let typeHeart = HKQuantityType.quantityType(forIdentifier: .heartRate)
let startDate = startDate
let endDate = endDate
let predicate: NSPredicate? = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)
let query = HKStatisticsQuery(quantityType: typeHeart!, quantitySamplePredicate: predicate, options: .discreteAverage, completionHandler: {(query: HKStatisticsQuery, result: HKStatistics?, error: Error?) -> Void in
DispatchQueue.main.async(execute: {() -> Void in
let quantity: HKQuantity? = result?.averageQuantity()
let beats: Double? = quantity?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute()))
print("Got: \(String(format: "%.f", beats!)) from \(startDate)")
let pulse = Pulse.init()
pulse.pulse = beats!
pulse.startDate = startDate
completion(pulse)
})
})
PermissionsHelper.shared.store.execute(query)
}
这是我打印结果时得到的结果:
获得:2019-03-30 82 23:00:00 +0000
获得:2019-03-31 74 22:00:00 +0000
获得:2019-03-25 73 23:00:00 +0000
从 2019-03-27 获得:74 23:00:00 +0000
获得:2019-03-26 70 23:00:00 +0000
获得:2019-03-29 74 23:00:00 +0000
获得:2019-03-28 108 23:00:00 +0000
我希望它们的顺序正确。
向数组添加元素后,您需要使用 sort() 函数。
Here 您可以找到有关实现它的所有方法的文档。
在这种情况下,如果pulseData是一个日期数组([Date]),你只需要调用:
self.pulseData.sort()
编辑:
正如您在我发布的 link 文档中看到的那样,有多种方法可以使用 sort() 函数将您的排序规则应用于自定义对象。
在这种情况下,我们假设您有这个 class:
class Pulse {
var pulse: Double = 0.0
var startDate = Date()
init(p: Double,d: Date) {
self.pulse = p
self.startDate = d
}
}
创建一个 Pulse 对象数组:
let pulse1 = Pulse(p: .., d: Date(...))
let pulse2 = Pulse(p: .., d: Date(...))
var pulseData: [Pulse] = [pulse1, pulse2]
可以这样对数组排序:
//Ascending order
pulseData.sort(by: {[=13=].startDate < .startDate})
我找到了解决我自己问题的有效方法。我将保留这个问题,因为我是 Swift 的新手,我认为可能有比我做的更好的方法。
func getHeartBeats(startDate: Date, endDate: Date) {
PulseHelper.shared.averageHearthRate(startDate: startDate, endDate: endDate) { (data) in
DispatchQueue.main.async {
self.pulseData.append(data)
self.pulseData = self.pulseData.sorted(by: {[=10=].startDate < .startDate})
self.updateGraph()
}
}
}
所以我所做的不是用带有心率的 Doubles 数组,而是用 pulse 和 startDate 创建了一个 Pulse class 并使用
按日期对它们进行排序
self.pulseData.sorted(by: {[=11=].startDate < .startDate})
我正在尝试从 HealthKit 获取脉搏数据并按日期对它们进行排序以便在折线图中使用。我是 运行 a 'for loop' 以获得正确的日期并将结果放入数组中,然后再将结果放入图表中,但它们似乎是随机排列的,我不明白为什么。
class Pulse {
var pulse = 0.0
var startDate = Date()
}
var pulseData: [Pulse] = []
func getHeartBeatsForAWeek() {
for i in 1...7 {
getHeartBeats(startDate: date.getStartOfSpecificDateByAddingToToday(day: -i), endDate: date.getStartOfSpecificDateByAddingToToday(day: -i + 1))
}
}
func getHeartBeats(startDate: Date, endDate: Date) {
PulseHelper.shared.averageHearthRate(startDate: startDate, endDate: endDate) { (data) in
DispatchQueue.main.async {
self.pulseData.append(data)
self.updateGraph()
}
}
}
这是我获取心率的函数:
func averageHearthRate(startDate: Date, endDate: Date, completion: @escaping (Pulse) -> Void) {
let typeHeart = HKQuantityType.quantityType(forIdentifier: .heartRate)
let startDate = startDate
let endDate = endDate
let predicate: NSPredicate? = HKQuery.predicateForSamples(withStart: startDate, end: endDate, options: HKQueryOptions.strictEndDate)
let query = HKStatisticsQuery(quantityType: typeHeart!, quantitySamplePredicate: predicate, options: .discreteAverage, completionHandler: {(query: HKStatisticsQuery, result: HKStatistics?, error: Error?) -> Void in
DispatchQueue.main.async(execute: {() -> Void in
let quantity: HKQuantity? = result?.averageQuantity()
let beats: Double? = quantity?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute()))
print("Got: \(String(format: "%.f", beats!)) from \(startDate)")
let pulse = Pulse.init()
pulse.pulse = beats!
pulse.startDate = startDate
completion(pulse)
})
})
PermissionsHelper.shared.store.execute(query)
}
这是我打印结果时得到的结果:
获得:2019-03-30 82 23:00:00 +0000
获得:2019-03-31 74 22:00:00 +0000
获得:2019-03-25 73 23:00:00 +0000
从 2019-03-27 获得:74 23:00:00 +0000
获得:2019-03-26 70 23:00:00 +0000
获得:2019-03-29 74 23:00:00 +0000
获得:2019-03-28 108 23:00:00 +0000
我希望它们的顺序正确。
向数组添加元素后,您需要使用 sort() 函数。
Here 您可以找到有关实现它的所有方法的文档。
在这种情况下,如果pulseData是一个日期数组([Date]),你只需要调用:
self.pulseData.sort()
编辑:
正如您在我发布的 link 文档中看到的那样,有多种方法可以使用 sort() 函数将您的排序规则应用于自定义对象。
在这种情况下,我们假设您有这个 class:
class Pulse {
var pulse: Double = 0.0
var startDate = Date()
init(p: Double,d: Date) {
self.pulse = p
self.startDate = d
}
}
创建一个 Pulse 对象数组:
let pulse1 = Pulse(p: .., d: Date(...))
let pulse2 = Pulse(p: .., d: Date(...))
var pulseData: [Pulse] = [pulse1, pulse2]
可以这样对数组排序:
//Ascending order
pulseData.sort(by: {[=13=].startDate < .startDate})
我找到了解决我自己问题的有效方法。我将保留这个问题,因为我是 Swift 的新手,我认为可能有比我做的更好的方法。
func getHeartBeats(startDate: Date, endDate: Date) {
PulseHelper.shared.averageHearthRate(startDate: startDate, endDate: endDate) { (data) in
DispatchQueue.main.async {
self.pulseData.append(data)
self.pulseData = self.pulseData.sorted(by: {[=10=].startDate < .startDate})
self.updateGraph()
}
}
}
所以我所做的不是用带有心率的 Doubles 数组,而是用 pulse 和 startDate 创建了一个 Pulse class 并使用
按日期对它们进行排序self.pulseData.sorted(by: {[=11=].startDate < .startDate})