【问题标题】:Better way to run multiple HealthKit sample queries?运行多个 HealthKit 示例查询的更好方法?
【发布时间】:2015-04-24 18:32:33
【问题描述】:

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

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

有没有更好的方法或者幼稚的方法是否合理?

【问题讨论】:

    标签: ios healthkit hksamplequery


    【解决方案1】:

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

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

    【讨论】:

    • 关于链接的评论:在第二个Web服务调用添加到调度组之前,第一个Web服务调用是否可能返回?如果是这样,dispatch_group_notify() 将在第二个 Web 服务请求完成之前被调用。更好的解决方案是调用 dispatch_group_enter(serviceGroup);在进行任何网络服务调用之前背靠背?
    • @bickster 只要调用 dispatch_group_enter 是在 notify 之前进行的,你就安全了。如果第一个在我们通知之前完成,那么 notify 将等待第二个。如果它们都完成了,则 notify 只会触发它的块。 GCD 调度组是多线程的极端抽象,因此它们使生活更轻松,但您仍然必须小心。如果您不能按顺序调用您的输入和通知,那么您可以深入挖掘 GCD 以获得更多控制权。
    • @bickster 并澄清我所说的“如果你不能按顺序调用你的输入和通知”是他们需要在同一个线程上同步发生。如果在 notify 后执行的异步线程上调用 enter,则 notify 回调将被意外执行。这里有很好的讨论GCD group discussion
    【解决方案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
    }
    

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 关于使用计数器跟踪查询完成的建议方法的旁注:您应该注意 healthKit 查询是异步的,这意味着您应该在更改计数器时保护它。
      • @goldengil 好点,我将更新答案以包含该内容。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2012-05-16
      • 1970-01-01
      • 2017-11-05
      相关资源
      最近更新 更多