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(使用前将#替换为@)