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

时间:2015-04-24 18:32:33

标签: ios health-kit hksamplequery

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

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

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

3 个答案:

答案 0 :(得分:5)

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

以下是一个示例链接:Using dispatch groups to wait for multiple web services

答案 1 :(得分:2)

您将要使用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
}

答案 2 :(得分:0)

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

跟踪公共函数中查询完成的一种简单方法是使用计数器,从零开始向查询数量计数,或从总查询数量减少到零。

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