Healthkit - вернуть последнюю тренировку в фоновом режиме - PullRequest
0 голосов
/ 04 мая 2019

Я использую следующий код, чтобы определить, когда какие-либо новые тренировки добавляются в аптечку в фоновом режиме. Однако всякий раз, когда метод вызывается, он возвращает все тренировки, которые были зарегистрированы с момента запуска фонового метода доставки. Есть ли способ отслеживать только новые типы тренировок, а не возвращать их все?

Вот код, который я вызываю в didFinishLaunching

    func startObservingNewWorkouts() {
    let currentUser = PFUser.current()
    if currentUser != nil {
        let query = PFQuery(className:"UserData")
        query.whereKey("Username", equalTo:currentUser!.username!)
        query.findObjectsInBackground { (objects: [PFObject]?, error: Error?) in
            if let error = error {
                // Log details of the failure
                print(error.localizedDescription)
            } else if let objects = objects {
                // The find succeeded.
                // Do something with the found objects
                for object in objects {
                    UserData = object
                    let sampleType =  HKObjectType.workoutType()

                    //1. Enable background delivery for workouts
                    self.healthKitStore.enableBackgroundDelivery(for: sampleType, frequency: .immediate) { (success, error) in
                        if let unwrappedError = error {
                            print("could not enable background delivery: \(unwrappedError)")
                        }
                        if success {
                            print("background delivery enabled")
                        }
                    }

                    //2.  open observer query
                    let query = HKObserverQuery(sampleType: sampleType, predicate: nil) { (query, completionHandler, error) in

                        self.updateWorkouts() {
                            completionHandler()
                        }


                    }
                    healthStore.execute(query)
                }
            }
        }
    }



}

func updateWorkouts(completionHandler: @escaping () -> Void) {

    var anchor: HKQueryAnchor?

    let sampleType =  HKObjectType.workoutType()

    let anchoredQuery = HKAnchoredObjectQuery(type: sampleType, predicate: nil, anchor: anchor, limit: HKObjectQueryNoLimit) { [unowned self] query, newSamples, deletedSamples, newAnchor, error in

        self.handleNewWorkouts(new: newSamples!, deleted: deletedSamples!)

        anchor = newAnchor

        completionHandler()
    }
    healthStore.execute(anchoredQuery)


}

func handleNewWorkouts(new: [HKSample], deleted: [HKDeletedObject]) {
    print("new sample added = \(new.last?.startDate)")
    userWorkouts = UserData["UserWorkouts"] as? [Dictionary<String,String>] ?? []
    let i = new.last as! HKWorkout
    var userWorkout = [String: String]()
    userWorkout["Description"] = i.description
    userWorkout["Source"] = i.sourceRevision.source.name
    userWorkout["Duration"] = String(format: "%.0f", i.duration)

    userWorkouts.insert(userWorkout, at: 0)
    UserData["UserWorkouts"] = userWorkouts
    UserData.saveInBackground {
        (success: Bool, error: Error?) in
        if (success) {
            self.userDefaults.set(userWorkouts2, forKey: "userWorkouts")
            self.userDefaults.set(Date(),forKey: "lastWorkoutUpdate")

            let content = UNMutableNotificationContent()
            content.title = "New Workout Logged!"
                content.body = "New workout logged from \(i.sourceRevision.source.name)
            content.sound = UNNotificationSound.default
            let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 2, repeats: false)
            let request = UNNotificationRequest(identifier: "notification.id.01", content: content, trigger: trigger)
            UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
            // The object has been saved.
        } else {
            // There was a problem, check error.description
        }
    }
    }
...