Ios 设置HKAnchoredObjectQuery以便我只接收自上次查询以来的更新?
我正在尝试设置一个Ios 设置HKAnchoredObjectQuery以便我只接收自上次查询以来的更新?,ios,swift,healthkit,Ios,Swift,Healthkit,我正在尝试设置一个HKAnchoredObjectQuery,它只提供上次我进行此查询时的结果,但我无法理解设置HKQueryAnchor的逻辑以及如何保持它?在中,它们不显示HKQueryAnchor的初始声明。我是否需要在本地存储我下载的最后一个示例的日期,并从该日期构建一个锚?下面的代码返回HealthKit中的每个示例 func updateWorkouts(completionHandler: @escaping () -> Void) { var anchor
HKAnchoredObjectQuery
,它只提供上次我进行此查询时的结果,但我无法理解设置HKQueryAnchor的逻辑以及如何保持它?在中,它们不显示HKQueryAnchor
的初始声明。我是否需要在本地存储我下载的最后一个示例的日期,并从该日期构建一个锚?下面的代码返回HealthKit中的每个示例
func updateWorkouts(completionHandler: @escaping () -> Void) {
var anchor: HKQueryAnchor?
let sampleType = HKObjectType.workoutType()
let workoutPredicate = HKQuery.predicateForWorkouts(with: .hockey)
let sourcePredicate = HKQuery.predicateForObjects(from: HKSource.default()) //limit query to only this app
let compound = NSCompoundPredicate(andPredicateWithSubpredicates: [workoutPredicate, sourcePredicate])
let anchoredQuery = HKAnchoredObjectQuery(type: sampleType, predicate: compound, anchor: anchor, limit: HKObjectQueryNoLimit) { [unowned self] query, newSamples, deletedSamples, newAnchor, error in
self.handleNewWorkouts(newWorkoutsAsSamples: newSamples!, deleted: deletedSamples!)
anchor = newAnchor
completionHandler()
}
healthStore.execute(anchoredQuery)
}
初始化
HKAnchoredObjectQuery
时,您需要提供nil
或从先前执行的查询中收到的锚对象。您不能自己直接构建HKQueryAnchor
。要在应用程序启动之间持久化锚点,可以使用NSKeyedArchiver
在持久存储中对其进行编码。将结果编码的NSData
存储在NSUserDefaults
中是很常见的。谢谢Allan,我使用UserDefaults
进行了设置,效果很好。