运行多个HealthKit样本查询的更好方法是什么?

Mat*_*tio 3 ios healthkit hksamplequery

我有一个场景,我需要从HealthKit中检索多组数据 - 体温,体重和血压.在我可以继续处理之前,我需要全部3,因为它们最终将以PDF格式结束.

我的天真第一种方法是运行一种,然后在HKSampleQuery的resultsHandler中调用第二种方法,然后在结果中调用第三种方法.感觉有点 - 我不知道 - 感觉我错过了什么.

是否有更好的方法或天真的方法是否合理?

ult*_*lex 6

您将需要使用 GCD 调度组。

首先为主线程设置一个全局变量

var GlobalMainQueue: dispatch_queue_t {
  return dispatch_get_main_queue()
}
Run Code Online (Sandbox Code Playgroud)

接下来,创建调度组:

let queryGroup = dispatch_group_create()
Run Code Online (Sandbox Code Playgroud)

在执行查询之前,调用:

dispatch_group_enter(queryGroup)
Run Code Online (Sandbox Code Playgroud)

查询执行后,调用:

dispatch_group_leave(queryGroup)
Run Code Online (Sandbox Code Playgroud)

然后,处理您的完成代码:

dispatch_group_notify(queryGroup, GlobalMainQueue) {
  // completion code here
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*Ojo 5

我遇到了同样的问题,对于任何类型的嵌套异步调用,更好的方法是使用GCD的调度组.这些允许您等到多个异步任务完成.

这是一个示例链接:使用调度组等待多个Web服务


All*_*lan 1

您应该尝试并行运行查询以获得更好的性能。在每个的完成处理程序中,调用一个公共函数来记录查询已完成。在该通用函数中,当您确定所有查询均已完成时,您可以继续下一步。

跟踪公共函数中查询完成情况的一种简单方法是使用计数器,要么从零向上计数到查询数量,要么从总查询数量向下计数到零。

由于 HealthKit 查询处理程序是在匿名后台调度队列上调用的,因此请确保同步对计数器的访问,方法是使用锁保护计数器或修改您控制的串行调度队列(例如主队列)上的计数器。

  • 关于使用计数器跟踪查询完成情况的建议方法的旁注:您应该注意 healthKit 查询是异步的这一事实,这意味着您应该在更改计数器时保护计数器。 (2认同)