按日期排序 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})