我在查询HKWorkout
时遇到问题。
下面是我用来保存HKWorkout
和HKQuantitySample
的代码。
func workout(#distance:Double, start: NSTimeInterval, paused:NSTimeInterval, resume:NSTimeInterval, end:NSTimeInterval, calory:Double) -> HKWorkout {
var event1_ = HKWorkoutEvent(type: HKWorkoutEventType.Pause, date: self.minutesBeforeNow(paused))
var event2_ = HKWorkoutEvent(type: HKWorkoutEventType.Resume, date: self.minutesBeforeNow(resume))
var calories_ = HKQuantity(unit: HKUnit.calorieUnit(), doubleValue: calory)
var distance_ = HKQuantity(unit: HKUnit.meterUnit(), doubleValue: distance)
var meta_ = [
"TITLE":"WORKOUT_TEST",
"TEAM":"TEAM WAG",
"ID":"(arc4random()%999)"
]
var workout_ = HKWorkout(
activityType: HKWorkoutActivityType.Cycling,
startDate: self.minutesBeforeNow(start),
endDate: self.minutesBeforeNow(end),
workoutEvents: [event1_, event2_],
totalEnergyBurned: calories_,
totalDistance: distance_,
metadata: meta_)
return workout_
}
func quantity(#distance:Double, start:NSTimeInterval, end:NSTimeInterval) -> HKQuantitySample {
var meta_ = [
"TITLE":"QUANTITY_SAMPLE_TEST",
"ID":"(arc4random()%99)"]
var sample_ = HKQuantitySample(
type: HKObjectType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceCycling),
quantity: HKQuantity(unit: HKUnit.meterUnit(), doubleValue: distance),
startDate: self.minutesBeforeNow(start),
endDate: self.minutesBeforeNow(end),
metadata:meta_)
return sample_
}
func minutesBeforeNow(min:NSTimeInterval) -> NSDate {
return NSDate().dateByAddingTimeInterval(-60 * min)
}
我用代码保存并运行良好。即使我也可以像一样使用HKSampleQuery进行查询
var predicate_ = HKQuery.predicateForSamplesWithStartDate(self.minutesBeforeNow(120), endDate: self.minutesBeforeNow(10), options: HKQueryOptions.None)
var query_ = HKSampleQuery(sampleType: HKSampleType.quantityTypeForIdentifier(HKQuantityTypeIdentifierDistanceCycling),
predicate: predicate_,
limit: 10,
sortDescriptors: nil) { (let sampleQuery, let samples, let error) -> Void in
BKLog("")
for sample in samples as [HKQuantitySample]
{
var meter_ = sample.quantity.doubleValueForUnit(HKUnit.meterUnit())
var km_ = meter_ / 1000
BKLog("(sample.metadata?.description), (km_))")
}
};
然而,当我尝试用HKWorkoutType查询时,我什么都没得到。
var query_ = HKSampleQuery(
sampleType: HKSampleType.workoutType(),
predicate: nil,
limit: 10,
sortDescriptors: nil) { (let query, let objects, let error) -> Void in
BKLog("") // 1
if(error != nil)
{
BKLog("ERROR : (error.localizedDescription)") // 2
return
}
else
{
BKLog("WORKOUST : (objects.count)") // 3
}
for workout in objects {
}
}
奇怪的是,我没有完成块的日志。没有来自1、2、3的日志发表评论。
当我使用class func predicateForObjectsFromWorkout(workout: HKWorkout!) -> NSPredicate!
时,它按我的预期工作。
为什么HKWorkoutType()
查询无法获取任何信息?
BKLog只是一个成型的日志函数
这似乎是iOS8.1中修复的HealthKit错误。我在8.1之前也遇到过同样的问题,但同样的代码在8.1中运行得很好。我检查使用8.1使用:
NSOperatingSystemVersion iOSVersionInWhichHealthKitActuallyWorks;
iOSVersionInWhichHealthKitActuallyWorks.majorVersion = 8;
iOSVersionInWhichHealthKitActuallyWorks.minorVersion = 1;
iOSVersionInWhichHealthKitActuallyWorks.patchVersion = 0;
if (![[NSProcessInfo processInfo]isOperatingSystemAtLeastVersion:iOSVersionInWhichHealthKitActuallyWorks]) {
}