3

我有一个场景,我需要从 HealthKit 中检索多组数据——体温、体重和血压。我需要全部 3 个才能继续处理,因为它们最终会变成 PDF。

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

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

4

3 回答 3

5

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

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

于 2016-02-03T00:35:42.940 回答
3

您将要使用 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
}
于 2016-02-13T22:07:48.083 回答
0

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

在通用函数中跟踪查询完成的一种简单方法是使用计数器,从零向上计数到查询数,或者从总查询数向下计数到零。

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

于 2015-04-26T05:12:49.510 回答