首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取过去7天的健康数据

如何获取过去7天的健康数据
EN

Stack Overflow用户
提问于 2018-03-10 15:33:01
回答 3查看 2.1K关注 0票数 0

我试图从过去的7天中获得步骤,但我无法找到如何做到这一点。我想要接收的是一个由7个元素组成的数组,其中每个元素都是一天,每个元素都有相应的步骤。我现在有这样的代码,它获得了今天的步骤:

代码语言:javascript
复制
//Gets the steps
func getTodaysSteps(completion: @escaping (Double) -> Void) {
    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    let now = Date()
    let startOfDay = Calendar.current.startOfDay(for: now)
    let predicate = HKQuery.predicateForSamples(withStart: startOfDay, end: now, options: .strictStartDate)

    let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { (_, result, error) in
        guard let result = result, let sum = result.sumQuantity() else {
            print("Failed to fetch steps = \(error?.localizedDescription ?? "N/A")")
            completion(0.0)
            return
        }

        DispatchQueue.main.async {
            completion(sum.doubleValue(for: HKUnit.count()))
        }
    }
    healthKitStore.execute(query)
}

我把这个函数叫做:

代码语言:javascript
复制
getTodaysSteps { (steps) in
        self.stepsNumber = Int(steps)
    }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-03-12 16:48:38

尝试使用HKStatisticsCollectionQuery,它将为您计算日期,并自动提取结果。下面是一个应该提供过去7天步骤计数的示例:

代码语言:javascript
复制
    let stepsQuantityType = HKQuantityType.quantityType(forIdentifier: .stepCount)!

    let now = Date()
    let exactlySevenDaysAgo = Calendar.current.date(byAdding: DateComponents(day: -7), to: now)!
    let startOfSevenDaysAgo = Calendar.current.startOfDay(for: exactlySevenDaysAgo)
    let predicate = HKQuery.predicateForSamples(withStart: startOfSevenDaysAgo, end: now, options: .strictStartDate)

    let query = HKStatisticsCollectionQuery.init(quantityType: stepsQuantityType,
                                                 quantitySamplePredicate: predicate,
                                                 options: .cumulativeSum,
                                                 anchorDate: startOfSevenDaysAgo,
                                                 intervalComponents: DateComponents(day: 1))

    query.initialResultsHandler = { query, results, error in
        guard let statsCollection = results else {
            // Perform proper error handling here...
        }

        statsCollection.enumerateStatistics(from: startOfSevenDaysAgo, to: now) { statistics, stop in

            if let quantity = statistics.sumQuantity() {
                let stepValue = quantity.doubleValueForUnit(HKUnit.countUnit())
                // ...
            }
        }
    }
票数 5
EN

Stack Overflow用户

发布于 2019-04-12 15:57:10

这里还有更简单的解决方案。

代码语言:javascript
复制
func getTotalSteps(forPast days: Int, completion: @escaping (Double) -> Void) {
    // Getting quantityType as stepCount
    guard let stepsQuantityType = HKObjectType.quantityType(forIdentifier: .stepCount) else {
        print("*** Unable to create a step count type ***")
        return
    }

    let now = Date()
    let startDate = Calendar.current.date(byAdding: DateComponents(day: -days), to: now)
    let predicate = HKQuery.predicateForSamples(withStart: startDate, end: now, options: .strictStartDate)

    let query = HKStatisticsQuery(quantityType: stepsQuantityType, quantitySamplePredicate: predicate, options: .cumulativeSum) { _, result, _ in
        guard let result = result, let sum = result.sumQuantity() else {
            completion(0.0)
            return
        }
        completion(sum.doubleValue(for: HKUnit.count()))
    }
    execute(query)
}

现在调用只需使用以下代码:

代码语言:javascript
复制
HKHealthStore().getTotalSteps(forPast: 30) { totalSteps in
    print(totalSteps)
}
票数 3
EN

Stack Overflow用户

发布于 2018-03-10 15:47:53

唯一需要实现的更改是更改作为Date参数提供给HKStatisticsQueryHKStatisticsQuery对象。您可以创建一个代表7天前一天开始的Date对象,方法是首先使用Calendar.date(byAdding:,to:)返回7天的时间,然后对该对象调用startOfDay(for:)

代码语言:javascript
复制
let now = Date()
let exactlySevenDaysAgo = Calendar.current.date(byAdding: DateComponents(day: -7), to: now)!
let startOfSevenDaysAgo = Calendar.current.startOfDay(for: exactlySevenDaysAgo)
let predicate = HKQuery.predicateForSamples(withStart: startOfSevenDaysAgo, end: now, options: .strictStartDate)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49210818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档