按日期对HealthKit数据进行排序

时间:2019-04-02 08:41:51

标签: swift sorting date health-kit

我正在尝试从HealthKit中获取脉搏数据,并按日期对它们进行排序,以用于折线图中。我正在运行“ for循环”以获取正确的日期并将结果放入数组中,然后再将结果放入图表中,但似乎它们以随机顺序放置,我不明白为什么。

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)
    }

这是我打印结果时得到的:

Got:82 from 2019-03-30 23:00:00 +0000

Got:74 from 2019-03-31 22:00:00 +0000

Got:73 from 2019-03-25 23:00:00 +0000

Got:74自2019-03-27 23:00:00 +0000

Got:70 from 2019-03-26 23:00:00 +0000

Got:74自2019-03-29 23:00:00 +0000

Got:108自2019-03-28 23:00:00 +0000

我希望他们得到正确的顺序。

2 个答案:

答案 0 :(得分:1)

我找到了一个可行的解决方案。我将保留这个问题,因为我是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: {$0.startDate < $1.startDate})
                self.updateGraph()
            }
        }
    }

所以我所做的是不是使用具有心率的Doubles数组,而是创建了一个带有pulse和startDate的Pulse类,并使用

按日期对它们进行了排序
self.pulseData.sorted(by: {$0.startDate < $1.startDate})

答案 1 :(得分:0)

在将元素添加到数组中之后,您需要使用sort()函数。

Here,您可以找到有关实现它的所有方法的文档。

在这种情况下,如果pulseData是一个Date数组([Date]),则只需调用:

   self.pulseData.sort()

编辑:

您可以在我发布的文档的链接中看到,有多种方法可以使用sort()函数将排序规则应用于自定义对象。

在这种情况下,我们假设您拥有此类:

      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: {$0.startDate < $1.startDate})