swift - 按日期排序 HealthKit 数据

标签 swift sorting date healthkit

我正在尝试从 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)
    }

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

得到:82 从 2019-03-30 23:00:00 +0000

得到:74 从 2019-03-31 22:00:00 +0000

得到:73 从 2019-03-25 23:00:00 +0000

得到:74 从 2019-03-27 23:00:00 +0000

得到:70 从 2019-03-26 23:00:00 +0000

得到:74 从 2019-03-29 23:00:00 +0000

得到:108 从 2019-03-28 23:00:00 +0000

我希望它们按正确的顺序排列。

最佳答案

我找到了解决我自己问题的有效方法。我将保留这个问题,因为我对 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})

关于swift - 按日期排序 HealthKit 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55470415/

相关文章:

ios - "Spotify like"在swift中拖动底部播放器

ios - 无法在 ScrollView 上选择选项卡栏中的项目

ios - 无法通过调用 FirstViewController 类中的函数隐藏 SecondViewController 类中的 View

javascript - 使用 Javascript 从 Json 对象中获取最大值

c++ - 在 C++ 中分离流

R:用日期列变量中的固定日期替换 NA(如果条件成立)

ios - 使用 ReactiveCocoa 4 的简单 UIGestureRecogniser 示例

algorithm - 搜索已排序的二维矩阵

javascript - HighCharts 错误的 xAxis 标签

javascript - 从纪元计算毫秒