I've had a long running problem of receiving this error from HealthKit when attempting to "modify" an HKWorkout
by (1) copying an existing workout (2) updating the metadata (3) deleting the "old" workout (selectedWorkout in my code below) then (4) saving the new modified workout. 98% of the time this code works flawlessly, however 2% of the time I will get this error and I end up with duplicate workouts. Am I doing anything wrong?
As an aside I really wish HealthKit would let us modify data so that this dance wasn't necessary.
class func updateMetadataDeleteOldAndSaveNewWorkout(selectedWorkout: HKWorkout, handler: @escaping (Bool,WorkoutManagerError? ) -> Void) {
//configure metadata
// Create a new workout with the old workout's fields and new edited metadata object
let newWorkout = HKWorkout(activityType: selectedWorkout.workoutActivityType, start: selectedWorkout.startDate, end: selectedWorkout.endDate, duration: selectedWorkout.duration, totalEnergyBurned: selectedWorkout.totalEnergyBurned, totalDistance: selectedWorkout.totalDistance, metadata: metadata)
// Delete the old workout
HealthStoreSingleton.sharedInstance.healthStore.delete(selectedWorkout, withCompletion: { (success, error) in
DispatchQueue.main.async {
if let unwrappedError = error {
handler(false, WorkoutManagerError.deleteError(unwrappedError.localizedDescription))
return
}
}
// When delete was successful save the new workout
HealthStoreSingleton.sharedInstance.healthStore.save(newWorkout) { success, error in
DispatchQueue.main.async {
if let unwrappedError = error {
handler(false, WorkoutManagerError.saveError(unwrappedError.localizedDescription))
return
}
if success {
handler(true, nil)
return
} else {
handler(false, WorkoutManagerError.saveError("\(String(describing: error))"))
return
}
}
}
})
I was facing a similar problem, My code is okay. In such case, HealthKit does not allow all data to be deleted. Only you can delete the data which are saved from your app.