iOS: 如何使用HKObserverQuery的后台更新completionHandler

66

HKObserverQuery 有以下支持在后台接收更新的方法:

- initWithSampleType:predicate:updateHandler:
updateHandler有一个completionHandler,其具有以下文档
这个块被传递给更新处理程序。只要您完成了入站数据的处理,就必须立即调用此块。调用此块会告诉HealthKit您已成功接收到后台数据。如果您不调用此块,HealthKit将继续尝试使用回退算法启动您的应用程序。如果您的应用程序连续三次未响应,则HealthKit认为您的应用程序无法接收数据,并停止向您发送后台更新。
从其他文章中看来,似乎围绕此处理程序存在很多混淆。以下是我对它的一些问题:
  • 何时应调用处理程序?如果调用太晚,则可能会导致HK认为应用程序从未接收到查询更新,从而使您触发背景更新3次打垮后退算法。文档指出,在处理其他查询之后应调用它。根据运行这些查询所需的时间长短,听起来您可能会非常接近触发背景更新打垮。
  • 为什么需要这个?系统不应该知道应用程序已启动并已接收到后台更新吗?在后台使用CoreBluetooth时,它只会在后台唤醒您的应用程序10秒钟。不需要调用任何处理程序或处理背景更新3次打垮。
  • 如果您触发了背景更新3次打垮并且HK停止发送更新,那么这是永久性的吗? HK是否会再次开始发送后台更新?如果有一个错误阻止了处理程序的调用,现在您已经修复了它。这个应用程序卡住了,永远无法接收更新吗?还是当应用程序重新启动或更新时会重置?
  • HK是否保持您的应用程序在后台运行直到调用处理程序?这是其目的的一部分还是副作用?如果这是它的目的,我们需要运行多长时间才能停止(并击中第一个背景更新打垮)?

  • 7
    这些是重要的问题,在目前的文档中没有得到答案。 - yairsz
    1个回答

    1

    什么时候应该调用处理程序?

    在完成工作后调用它。您的代码不应执行复杂操作。应用程序在后台运行,用户看不到发生了什么变化。您可以设置一个“标志”,表示数据已更新,并在用户启动应用程序后执行复杂操作。如果您的决定基于复杂操作是否通知用户,则尝试重构代码,使所有必要的数据预先计算(例如,在UserDefaults中),并且额外的数据只需使用该数据获取即可。因此,1-2秒足以进行计算。

    为什么需要这个?

    所有这些处理程序都有完成闭包。它们对于iOS来说是必要的,以了解您的应用程序是否正常工作。如果您的应用程序将占用太多CPU时间,则iOS可能会变得缓慢。因此,苹果希望确保iOS能够正常工作,尽管存在糟糕的应用程序。

    如果您在后台更新3次并且HK停止发送更新,那是否永久性?

    不。

    HK是否会重新开始发送后台更新?

    是的。但这取决于许多因素。它可能会在1-2天内再次调用您的应用程序。如果没有任何更改,它将很少调用。

    你的应用程序是否一直在后台运行,直到调用处理程序?

    这是未知的。它取决于许多因素。如果 iPhone 正在充电,它可能会允许您的应用程序运行更长时间,以估计是否调用完成处理程序。如果您的 iPhone 没有充电并且电池电量接近 0%,则更有可能 iOS 将关闭您的应用程序。因此,在调用完成处理程序之后,您不应执行任何工作。并尽量保持简单。

    建议

    您应该尽快处理新数据。如果需要获取大量数据,则尝试在应用程序处于前台时进行优化和预计算,然后保存在某个位置(UserDefault),并使用缓存的数据和新数据进行决策(例如通知用户某些内容;我相信您正需要背景更新来实现这一点)。

    1-2 秒或更短的时间是进行后台更新的良好时间。


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接