HealthKit Ошибка «Не удалось найти некоторые объекты для удаления» при попытке удалить HKWorkout - PullRequest
0 голосов
/ 17 ноября 2018

У меня была длительная проблема с получением этой ошибки от HealthKit при попытке «изменить» HKWorkout путем (1) копирования существующей тренировки (2) обновления метаданных (3) удаления «старой» тренировки(выбрано Workout в моем коде ниже), затем (4) сохранение новой измененной тренировки.В 98% случаев этот код работает безупречно, однако в 2% случаев я получаю эту ошибку и в итоге получаю дублирующиеся тренировки.Я делаю что-то не так?

Кроме того, я бы очень хотел, чтобы HealthKit позволил нам изменять данные так, чтобы этот танец не был необходим.

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 
                            }
                        }
                    }
                })
...