iOS:使用HKObserverQuery的后台更新completionHandler

2024-02-26

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

- initWithSampleType:predicate:updateHandler:

The updateHandler has a completionHandler其中有以下内容文档 https://developer.apple.com/library/prerelease/ios/documentation/HealthKit/Reference/HKObserverQuery_Class/index.html:

该块被传递给更新处理程序。您必须调用此块 一旦处理完传入的数据。调用这个 块告诉 HealthKit 您已成功收到 后台数据。如果你不调用这个块,HealthKit 会继续 尝试使用退避算法启动您的应用程序。如果你的应用程序 三次未能响应,HealthKit 假设您的应用程序无法响应 接收数据,并停止向您发送后台更新。

从其他帖子来看,这个处理程序似乎有很多混乱。以下是我对此的一些疑问:

  • 什么时候应该调用处理程序?如果调用得太晚,那么 HK 可能会认为该应用程序从未收到查询更新,导致您触发后台更新 3 击退避算法。文档指出应该在处理其他查询后调用它。根据运行这些查询所需的时间,听起来您可能会危险地接近后台更新罢工。
  • 为什么需要这个?系统不是应该知道app已经启动并且已经收到后台更新了吗?使用时CoreBluetooth在后台,它只会在后台唤醒您的应用程序 10 秒钟。无需调用任何处理程序或处理后台更新三击。
  • 如果您点击后台更新三击并且 HK 停止发送更新,这是永久性的吗? HK 是否会再次开始发送后台更新?如果存在阻止调用处理程序的错误,并且现在您已修复它,该怎么办?应用程序是否卡住了,无法接收更新?或者当应用程序重新启动或更新时它会重置吗?
  • HK 是否会让您的应用程序在后台运行,直到调用处理程序?这是其目的的一部分还是只是副作用?如果这是其目的的一部分,那么在需要停止(并进行第一次后台更新罢工)之前我们可以运行多长时间?

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

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

为什么需要这个?

所有此类处理程序都有完成闭包。 iOS 需要它们来了解您的应用程序是否正常运行。如果您的应用程序占用太多 CPU 时间,那么 iOS 可能会变得很慢。因此,苹果希望确保 iOS 能够在应用程序质量不佳的情况下正常运行。

如果您点击后台更新三击并且 HK 停止发送更新,这是永久性的吗?

No.

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

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

HK 是否会让您的应用程序在后台运行,直到调用处理程序?

这是未知的。这取决于很多因素。如果 iPhone 正在充电,它可能会允许您的应用程序运行更长时间,只是为了估计完成句柄是否被调用。如果您的 iPhone 未充电且电量接近 0%,那么 iOS 更有可能会终止您的应用程序。因此,在调用完成处理程序后,您不应该执行任何操作。并尽量保持简单。

建议

您应该尽快处理新数据。如果您需要获取大量数据,请尝试优化它并在应用程序处于前台时预先计算它,然后保存在某个地方(UserDefault),并使用新数据和缓存数据来做出决定(例如通知用户有关一些东西;我相信您需要为此进行背景更新)。

1-2 秒或更短的时间是后台更新的最佳时间。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS:使用HKObserverQuery的后台更新completionHandler 的相关文章

随机推荐