Ios 当应用程序处于活动状态时,始终调用health kit observer查询
当应用程序处于活动状态时(后台->前台),始终调用Ios 当应用程序处于活动状态时,始终调用health kit observer查询,ios,iphone,swift,healthkit,Ios,Iphone,Swift,Healthkit,当应用程序处于活动状态时(后台->前台),始终调用HKObserverQuery的resultHandler 但是,我在AppDelegate.swift中的didfishlaunchingwithoptions方法中编写了查询代码。我知道该方法是在应用程序启动时调用的,而不是在应用程序处于活动状态时调用的 func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [
HKObserverQuery
的resultHandler
但是,我在AppDelegate.swift
中的didfishlaunchingwithoptions
方法中编写了查询代码。我知道该方法是在应用程序启动时调用的,而不是在应用程序处于活动状态时调用的
func application(application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
healthStore.authorizeHealthKit {
...
}
}
// other AppDelegate methods are empty
如何使查询的处理程序仅在我的应用程序启动时调用?为什么要阻止updateHandler启动 在查询运行时,无法控制何时触发
HKObserverQuery
的updateHandler。您可以通过停止查询来阻止调用它。它被设计为在有新的HealthKit数据与谓词匹配时调用。你应该设计你的updateHandler
,这样它在什么时候被调用就不重要了
如果你真的想让observer查询在你的应用程序返回前台时不触发,你需要在你的应用程序进入后台时,在暂停之前,使用
-[HKHealthStore stopQuery:
完全停止查询。我只想在添加一些健康工具包样本时触发updateHandler
。返回前台并不意味着添加了一些新样本。最糟糕的情况是,你的应用程序将重新查询,但没有发现任何新的内容。HKObserverQuery不保证调用updateHandler的次数,它是一个提示信号,表明您感兴趣的数据可能已被添加或删除。嗨@Allan,问题是它会减慢应用程序的工作速度。让我们考虑一下当你有HK数据的本地缓存(即步骤)来快速访问的时候,你想保持它与HK同步。您可以设置观察者查询,并在其中一个查询被触发时重新同步数据。这意味着每次应用程序激活时,您都必须再次重新请求所有数据(因为所有观察者查询都被触发),这需要相当长的时间。此外,在这种情况下,使用observer查询没有任何意义,因为每次应用程序激活时,您都可以重新加载所有数据。@Allan如果苹果能够改进observer机制,使observer查询仅在有新数据时才会触发,那将非常有帮助;)谢谢如果你想让你的应用程序与HealthKit保持同步,你应该使用带有更新处理程序的HKAnchoredObjectQuery。它正是为您描述的情况而设计的。