HealthKit使用回退方法锚定查询?

时间:2016-06-17 09:29:44

标签: ios swift health-kit

我需要将我的应用程序数据库与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)
    }
}

两个问题:

  1. 我不知道如何坚持使用HKQueryAnchor,因为iOS 8并不支持它。我应该将持久化变量更新为查询处理程序返回的新锚对象。如果我能以某种方式将其转换为Int,我可以将其存储为类变量,但我不知道如何。

  2. HKAnchoredObjectQuery不推荐使用的初始值设定项使用的处理程序不会返回已删除的对象。这是否意味着我无法在iOS 8中跟踪已删除的HKSamples?

1 个答案:

答案 0 :(得分:2)

关于第一个问题,HKQueryAnchor是在iOS 9上引入的,并且在iOS 8上确实无法使用。但是,阅读它的documentation会产生它符合NSSecureCoding,这意味着您可以将其存储在用户默认值中以保持持久性。因此,您可以在iOS 9上管理包含相关类型标识符的键和相应HKQueryAnchor的值的字典,而在iOS 8上管理具有保持锚值的NSNumber的相同列表

为了向后兼容,您可以使用anchorFromValue:的{​​{1}}类方法将旧锚值转换为新类。

关于第二个问题,据我所知,在iOS 8上跟踪已删除的HKQueryAnchor没有直接的方法。您可以了解有关执行此操作的方法的更多信息在{9}}

上的iOS 9上