【问题标题】:HealthKit anchored queries with fallback methods?HealthKit 使用后备方法锚定查询?
【发布时间】:2016-07-20 17:12:09
【问题描述】:

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

【问题讨论】:

    标签: ios swift healthkit


    【解决方案1】:

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

    为了向后兼容,您可以使用HKQueryAnchoranchorFromValue: 类方法将旧锚值转换为新类。

    关于您的第二个问题,据我所知,在 iOS 8 上没有一种直接的方法来跟踪已删除的HKSamples。您可以了解更多关于在 iOS 9 上执行此操作的方法在session 203 of WWDC2015

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多