HKSampleQuery для HKWorkout
У меня проблема с запросом 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 - это просто сформированная лог-функция
1 ответ
Это похоже на ошибку HealthKit, исправленную в iOS8.1. У меня была точно такая же проблема до 8.1, но тот же код прекрасно работает в 8.1. Я проверяю использование для 8.1 с помощью:
NSOperatingSystemVersion iOSVersionInWhichHealthKitActuallyWorks;
iOSVersionInWhichHealthKitActuallyWorks.majorVersion = 8;
iOSVersionInWhichHealthKitActuallyWorks.minorVersion = 1;
iOSVersionInWhichHealthKitActuallyWorks.patchVersion = 0;
if (![[NSProcessInfo processInfo]isOperatingSystemAtLeastVersion:iOSVersionInWhichHealthKitActuallyWorks]) {
}