我有一个场景,我需要从HealthKit中检索多组数据 - 体温,体重和血压。在我可以继续处理之前我需要所有3,因为它们最终会以PDF形式结束。
我天真的第一种方法是运行一种,然后在HKSampleQuery的resultsHandler中调用第二种方法,然后在resultsHandler中调用第三种方法。感觉有点 - 我不知道 - 感觉我错过了什么。
有更好的方法还是天真的方法合理?
答案 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查询处理程序,因此请确保同步对计数器的访问,方法是使用锁保护或通过修改您控制的串行调度队列上的计数器,例如主队列中。