我需要将我的应用程序数据库与HealthKit同步,而我目前正在使用HKAnchoredObjectQuery来仅接收最近的数据。我的部署目标是iOS 8.0,但我想实现一个回退方法,以便更好地支持iOS 9.0+。这是当前的代码:
func synchronize(sampleType: HKSampleType) {
if #available(iOS 9.0, *) {
let queryAnchor = HKQueryAnchor(fromValue: self.anchor)
let resultsHandler: (HKAnchoredObjectQuery, [HKSample]?, [HKDeletedObject]?, HKQueryAnchor?, NSError?) -> Void = {
query, newSamples, deletedSamples, newAnchor, error in
// Handle results here
// TODO: QueryAnchor should persist in order to receive only new data changes!
}
let query = HKAnchoredObjectQuery(type: sampleType,
predicate: nil,
anchor: queryAnchor,
limit: HKObjectQueryNoLimit,
resultsHandler: resultsHandler)
healthKitStore.executeQuery(query)
} else {
// Fallback on earlier versions
let completionHandler: (HKAnchoredObjectQuery, [HKSample]?, Int, NSError?) -> Void = {
query, results, newAnchor, error in
// Handle results here
self.anchor = newAnchor
}
let query = HKAnchoredObjectQuery(type: sampleType,
predicate: nil,
anchor: self.anchor,
limit: HKObjectQueryNoLimit,
completionHandler: completionHandler)
healthKitStore.executeQuery(query)
}
}
两个问题:
我不知道如何坚持使用HKQueryAnchor,因为iOS 8并不支持它。我应该将持久化变量更新为查询处理程序返回的新锚对象。如果我能以某种方式将其转换为Int,我可以将其存储为类变量,但我不知道如何。
HKAnchoredObjectQuery不推荐使用的初始值设定项使用的处理程序不会返回已删除的对象。这是否意味着我无法在iOS 8中跟踪已删除的HKSamples?
答案 0 :(得分:2)
关于第一个问题,HKQueryAnchor
是在iOS 9上引入的,并且在iOS 8上确实无法使用。但是,阅读它的documentation会产生它符合NSSecureCoding
,这意味着您可以将其存储在用户默认值中以保持持久性。因此,您可以在iOS 9上管理包含相关类型标识符的键和相应HKQueryAnchor
的值的字典,而在iOS 8上管理具有保持锚值的NSNumber
的相同列表
为了向后兼容,您可以使用anchorFromValue:
的{{1}}类方法将旧锚值转换为新类。
关于第二个问题,据我所知,在iOS 8上跟踪已删除的HKQueryAnchor
没有直接的方法。您可以了解有关执行此操作的方法的更多信息在{9}}