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

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

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

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

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

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

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

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

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

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