GarySabo
GarySabo

Reputation: 6680

Setting up an HKAnchoredObjectQuery so that I only receive updates since the last time I queried?

I'm trying to set up an HKAnchoredObjectQuery that will only deliver results from the last time I made this query, but I can't get my head around the logic in setting up my HKQueryAnchor and how I persist it? In Apple's sample code they do not show the initial declaration for the HKQueryAnchor. Do I need to store locally the date of the last sample I downloaded and construct an anchor from that date? This code below returns every sample in HealthKit.

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

        var anchor: HKQueryAnchor?

        let sampleType =  HKObjectType.workoutType()
        let workoutPredicate = HKQuery.predicateForWorkouts(with: .hockey)
        let sourcePredicate = HKQuery.predicateForObjects(from: HKSource.default()) //limit query to only this app
        let compound = NSCompoundPredicate(andPredicateWithSubpredicates: [workoutPredicate, sourcePredicate])

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

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

            anchor = newAnchor

            completionHandler()
        }
        healthStore.execute(anchoredQuery)


    }

Upvotes: 0

Views: 1746

Answers (1)

Allan
Allan

Reputation: 7353

When initializing an HKAnchoredObjectQuery, you are expected to either provide nil or an anchor object that you received from a query that you executed previously. You cannot directly construct an HKQueryAnchor yourself. To persist an anchor between application launches, you can encode it in persistent storage using NSKeyedArchiver. It is common to store the resulting encoded NSData in NSUserDefaults.

Upvotes: 1

Related Questions