【发布时间】:2017-03-27 06:03:21
【问题描述】:
我已在我的委托的 didFinishLaunching 方法中注册了四种类型的 HealthKit 数据的后台传输。数据类型有步数、睡眠、锻炼和energyConsumed。
我注意到在某些情况下,HealthKit/iOS 每秒多次调用我对这些数据类型的观察者查询。以下是调用睡眠观察器查询的一些设备日志的示例:
2017/03/27 07:21:58:821 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:58:894 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:58:936 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:58:973 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:58:993 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:000 代表 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:024 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:130 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:145 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:156 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:169 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:309 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:328 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:346 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:404 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:480 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:499 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:520 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:547 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:561 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:571 委托 - 步骤观察者查询收到新数据
2017/03/27 07:21:59:583 委托 - 步骤观察者查询收到新数据
这是我的应用程序委托中创建此日志的代码:
- (void)setUpStepsObserverQuery {
__weak typeof(self) weakSelf = self;
HKSampleType *sampleType = [HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount];
HKObserverQuery *query = [[HKObserverQuery alloc] initWithSampleType:sampleType predicate:nil updateHandler:^(HKObserverQuery *query, HKObserverQueryCompletionHandler completionHandler, NSError *error) {
if (completionHandler) {
completionHandler();
}
if (error) {
DDLogDebug(@"App Delegate - An error occured while setting up the stepCount observer: %@", error.localizedDescription);
} else {
DDLogDebug(@"Delegate - steps observer query received new data");
weakSelf.activityTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
[weakSelf endBackgroundTask:weakSelf.activityTask];
}];
// At this point I run an anchor query to check if there really is new data, and if there is I go ahead and send the new HealthKit data to our server.
}];
[_healthStore executeQuery:query]; // _healthStore is a shared instance of HKHealthStore I created earlier
}
这就是我为步骤数据启用后台传送的方式。我在didFinishLaunching 中调用了这个方法,它调用了我在上面共享一个sn-p 的方法setUpStepsObserverQuery
if ([defaults boolForKey:HK_ACTIVITY_SYNC]) {
[self setUpStepsObserverQuery];
[_healthStore enableBackgroundDeliveryForType:[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierStepCount]
frequency:HKUpdateFrequencyImmediate
withCompletion:^(BOOL success, NSError * _Nullable error) {
DDLogDebug(@"Delegate - enabled step count background updates");
}];
关于为什么 HealthKit 会在同一分钟内多次调用我的观察者查询的任何想法?
【问题讨论】: