iOS:使用HKObserverQuery的后台更新完成处理程序


68

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

- initWithSampleType:predicate:updateHandler:

updateHandler具有completionHandler以下文档

该块被传递给更新处理程序。处理完传入数据后,必须立即调用此块。调用此块将告知HealthKit您已成功接收背景数据。如果您不调用此块,HealthKit会继续尝试使用退避算法来启动您的应用程序。如果您的应用程序无法响应三次,HealthKit会假定您的应用程序无法接收数据,并停止向您发送后台更新。

通过查看其他帖子,似乎与此处理程序有关的混乱很多。以下是我对此有的一些疑问:

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

7
这些是重要的问题,目前尚未在文档中回答。
yairsz 2015年

Answers:


1

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

完成工作后调用它。您的代码不应执行复杂的操作。该应用程序在后台运行,用户看不到更改内容。您只需设置一个“标志”即可更新数据,并在用户启动应用程序后执行复杂的操作。如果您决定根据复杂的操作通知用户还是不通知用户,请尝试重构代码,以便预先计算所有必需的数据(例如在UserDefaults中),并简单地使用该数据获取额外的数据。因此,1-2秒就足够您进行计算了。

为什么需要这个?

所有此类处理程序均具有完成关闭功能。iOS需要使用它们来了解您的应用程序是否正常运行。如果您的应用会占用过多的CPU时间,那么iOS可能会变慢。因此,Apple希望确保尽管有不良应用程序,iOS仍能正常运行。

如果您按下后台更新三击,而香港停止发送更新,那是永久性的吗?

没有。

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

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

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

这是未知的。这取决于许多因素。如果iPhone正在充电,则可能会使您的应用运行更长的时间,只是为了估计是否调用了完成处理。如果您的iPhone未充电且电池电量接近0%,则iOS更有可能杀死您的应用。因此,调用完成处理程序后,您不应执行任何工作。并尝试保持简单。

推荐建议

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.