从 HKSampleQuery 获取最新数据点
Posted
技术标签:
【中文标题】从 HKSampleQuery 获取最新数据点【英文标题】:Get most recent data point from HKSampleQuery 【发布时间】:2017-06-30 15:14:01 【问题描述】:我无法使用HKSampleQuery
获取最新的体重数据点。我正确设置了应用程序权限,但HKQuantityTypeIdentifier.bodyMass
没有从 Health 应用程序返回最新的数据条目。
我应该如何使用HKSampleQuery
获取最新的体重数据点?
我认为这是因为我为 Weight
设置的 0.0 是返回的内容,我在 readWeight
上没有得到控制台输出
编辑 1
我的代码包括调试过程如下。
public func readWeight(result: @escaping (Double) -> Void)
if (debug)print("Weight")
let quantityType = HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)
let weightQuery = HKSampleQuery(sampleType: quantityType!, predicate: nil, limit: 1, sortDescriptors: nil)
query, results, error in
if (error != nil)
if (self.debug)print(error!)
result(166.2) //Set as average weight for American
return
guard let results = results else
if (self.debug)print("No results of query")
result(166.2)
return
if (results.count == 0)
if (self.debug)print("Zero samples")
result(166.2)
return
guard let bodymass = results.first as? HKQuantitySample else
if (self.debug)print("Type problem with weight")
result(166.2)
return
if (self.debug)print("Weight" + String(bodymass.quantity.doubleValue(for: HKUnit.pound())))
if (bodymass.quantity.doubleValue(for: HKUnit.pound()) != 0.0)
result(bodymass.quantity.doubleValue(for: HKUnit.pound()))
else
result(166.2)
healthKitStore.execute(weightQuery)
函数是这样使用的:
var Weight = 0.0 //The probable reason that it returns 0.0
readWeight() weight in
Weight = weight
编辑 2
权限代码:
let healthKitTypesToRead : Set<HKQuantityType> = [
HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryWater)!,
HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.bodyMass)!,
HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.appleExerciseTime)!
]
let healthKitTypesToWrite: Set<HKQuantityType> = [
HKQuantityType.quantityType(forIdentifier: HKQuantityTypeIdentifier.dietaryWater)!
]
if (!HKHealthStore.isHealthDataAvailable())
if (self.debug)print("Error: HealthKit is not available in this Device")
return
healthKitStore.requestAuthorization(toShare: healthKitTypesToWrite, read: healthKitTypesToRead) (success, error) -> Void in
if (success)
DispatchQueue.main.async()
self.pointView.text = String(self.currentPoints())
if ((error) != nil)
if (self.debug)print(error!)
return
【问题讨论】:
请附上你的代码和到目前为止你所做的调试的描述。 Gotcha @Allan 让我编辑我的问题 @Allan done btw 我也使用断点尝试调试它 @arodebaugh 为了将来参考,如果您的问题不是专门针对版本之间语言本身的更改,请不要使用swift3 标签(或任何其他语言和版本标签)。相反,您可以在问题正文中指定您使用的语言。 【参考方案1】:正如HealthKit documentation 中解释的那样(我强烈建议您完整阅读),HKSampleQuery
不保证它返回的样本或返回它们的顺序除非 您指定应如何返回样本。
对于您的情况,可以通过多种方式返回最新的数据点。看看HKSampleQuery
和下面的方法:
init(sampleType:predicate:limit:sortDescriptors:resultsHandler:)
您可以为返回的样本提供排序顺序,或限制返回的样本数量。
-- HKSampleQuery Documentation
在您的代码中,您对查询进行了适当的限制,使其仅返回一个样本。这是正确的,并且避免了您的用例中不必要的开销。但是,您的代码为 sortDescriptors
参数指定了 nil
。这意味着查询可以按照它喜欢的任何顺序返回样本(因此,返回给您的单个样本通常不是您要查找的)。
一个排序描述符数组,指定此查询返回的结果的顺序。如果您不需要特定顺序的结果,则传递 nil。
注意 HealthKit 定义了许多排序标识符(例如,
HKSampleSortIdentifierStartDate
和HKWorkoutSortIdentifierDuration
)。仅在查询中使用您使用这些标识符创建的排序描述符。您不能使用它们对样本数组执行内存排序。-- HKSampleQuery.init(...) Documentation
因此,解决方案是简单地提供一个排序描述符,要求HKSampleQuery
按日期按降序排列样本(意味着最近的样本将在列表中排在第一位)。
我希望上面的答案比简单复制/粘贴解决问题所需的代码更有帮助。尽管如此,为此特定用例提供正确示例的代码如下:
// Create an NSSortDescriptor
let sort = [
// We want descending order to get the most recent date FIRST
NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
]
let weightQuery = HKSampleQuery(sampleType: quantityType!, predicate: nil, limit: 1, sortDescriptors: sort)
// Handle errors and returned samples...
【讨论】:
非常感谢:D 最后:D 这只会拉下过去 7 天的结果吗? ***.com/questions/48717614/…以上是关于从 HKSampleQuery 获取最新数据点的主要内容,如果未能解决你的问题,请参考以下文章