运行 多个 HealthKit 示例查询的更好方法?
Better way to run multiple HealthKit sample queries?
我有一个场景需要从 HealthKit 中检索多组数据——体温、体重和血压。在我继续处理之前我需要全部 3 个,因为它们将以 PDF 格式结束。
我天真的第一种方法是 运行 一个,然后在 HKSampleQuery 的 resultsHandler 中调用第二个,然后在那个 resultsHandler 中调用第三个。感觉有点——我不知道——感觉好像我错过了什么。
是否有更好的方法或者天真的方法是否合理?
您应该尝试 运行 并行查询以获得更好的性能。在每个完成处理程序中,调用一个通用函数来记录查询已完成。在那个公共函数中,当您确定所有查询都已完成时,您可以继续下一步。
跟踪公共函数中查询完成情况的一种简单方法是使用计数器,从零向上计数到查询数,或者从总查询数向下计数到零。
由于 HealthKit 查询处理程序是在匿名后台调度队列上调用的,因此请确保同步访问您的计数器,方法是用锁保护它或修改您控制的串行调度队列上的计数器,例如主队列。
我 运行 遇到了同样的问题,对于任何类型的嵌套异步调用,更好的方法是使用 GCD 的调度组。这些允许您等到多个异步任务完成。
这是一个 link 示例:Using dispatch groups to wait for multiple web services
您将要使用 GCD 调度组。
首先为主线程设置一个全局变量
var GlobalMainQueue: dispatch_queue_t {
return dispatch_get_main_queue()
}
接下来,创建调度组:
let queryGroup = dispatch_group_create()
在您的查询执行之前,调用:
dispatch_group_enter(queryGroup)
查询执行后,调用:
dispatch_group_leave(queryGroup)
然后,处理您的完成代码:
dispatch_group_notify(queryGroup, GlobalMainQueue) {
// completion code here
}
我有一个场景需要从 HealthKit 中检索多组数据——体温、体重和血压。在我继续处理之前我需要全部 3 个,因为它们将以 PDF 格式结束。
我天真的第一种方法是 运行 一个,然后在 HKSampleQuery 的 resultsHandler 中调用第二个,然后在那个 resultsHandler 中调用第三个。感觉有点——我不知道——感觉好像我错过了什么。
是否有更好的方法或者天真的方法是否合理?
您应该尝试 运行 并行查询以获得更好的性能。在每个完成处理程序中,调用一个通用函数来记录查询已完成。在那个公共函数中,当您确定所有查询都已完成时,您可以继续下一步。
跟踪公共函数中查询完成情况的一种简单方法是使用计数器,从零向上计数到查询数,或者从总查询数向下计数到零。
由于 HealthKit 查询处理程序是在匿名后台调度队列上调用的,因此请确保同步访问您的计数器,方法是用锁保护它或修改您控制的串行调度队列上的计数器,例如主队列。
我 运行 遇到了同样的问题,对于任何类型的嵌套异步调用,更好的方法是使用 GCD 的调度组。这些允许您等到多个异步任务完成。
这是一个 link 示例:Using dispatch groups to wait for multiple web services
您将要使用 GCD 调度组。
首先为主线程设置一个全局变量
var GlobalMainQueue: dispatch_queue_t {
return dispatch_get_main_queue()
}
接下来,创建调度组:
let queryGroup = dispatch_group_create()
在您的查询执行之前,调用:
dispatch_group_enter(queryGroup)
查询执行后,调用:
dispatch_group_leave(queryGroup)
然后,处理您的完成代码:
dispatch_group_notify(queryGroup, GlobalMainQueue) {
// completion code here
}