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。它正是为您描述的情况而设计的。