过滤不是来自我的应用程序的HKSample数据

3

在我的当前项目中,我需要将HealthKit样本与我的应用程序同步。我正在从HealthKit获取样本数据,并将一些应用程序生成的样本写回到HealthKit。对于获取,我正在使用以下函数:

private func readHealthKitSample(sampleType:HKSampleType, limit: Int, startDate: NSDate, endDate: NSDate, completion: (([HKSample]?, NSError!) -> Void)!){

    let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)

    // 2. Build the sort descriptor to return the samples in descending order
    let sortDescriptor = NSSortDescriptor(key:HKSampleSortIdentifierStartDate, ascending: false)

    // 3. we want to limit the number of samples returned by the query to just 1 (the most recent)
    let limit = limit

    // 4. Build samples query
    let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: mostRecentPredicate, limit: limit, sortDescriptors: [sortDescriptor])
        { (sampleQuery, results, error ) -> Void in

            if let error = error {
                self.Logger.error("HealthKit Sample Data Fetch Error: \(error.localizedDescription)")
                completion(nil , error)
                return;
            } else {
               // self.Logger.debug("HealthKit Sample Data Fetch SUCCESS: \(results)")
            }

            // Execute the completion closure
            if completion != nil {
                completion(results,nil)
            }
    }
    // 5. Execute the Query
    self.healthKitStore.executeQuery(sampleQuery)
}

我的应用程序要求不考虑自己写入HealthKit Store的样本。因此,是否有一种方法可以以这样的方式过滤样本数据,以避免接收由我的应用程序编写的样本,并仅考虑由其他应用程序编写的样本?

1个回答

8
你可以使用 HKSource 来过滤你自己的应用程序,并使用 NSCompoundPredicate 将其与现有的谓词过滤器组合起来:
let mostRecentPredicate = HKQuery.predicateForSamplesWithStartDate(startDate, endDate:endDate, options: .None)
let myAppPredicate = HKQuery.predicateForObjectsFromSource(HKSource.defaultSource()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])

let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
    // Process results here...
}

Swift 5+:

let mostRecentPredicate = HKQuery.predicateForSamples(withStart: startDate, end:endDate, options: [])
let myAppPredicate = HKQuery.predicateForObjects(from: HKSource.default()) // This would retrieve only my app's data
let notMyAppPredicate = NSCompoundPredicate(notPredicateWithSubpredicate: myAppPredicate) // This will retrieve everything but my app's data
let queryPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [mostRecentPredicate, notMyAppPredicate])

let sampleQuery = HKSampleQuery(sampleType: sampleType, predicate: queryPredicate, limit: limit, sortDescriptors: [sortDescriptor]) {
   // Process results here...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接