Ios HealthKit提供的数据可能不完整?

Ios HealthKit提供的数据可能不完整?,ios,objective-c,healthkit,Ios,Objective C,Healthkit,有没有人遇到过HealthKit提供的数据不完整的问题?使用以下查询: HKAnchoredObjectQuery *newQuery = [[HKAnchoredObjectQuery alloc] initWithType:quantityType predicate:predicate anchor:anchor limit:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArr

有没有人遇到过HealthKit提供的数据不完整的问题?使用以下查询:

HKAnchoredObjectQuery *newQuery = [[HKAnchoredObjectQuery alloc] initWithType:quantityType predicate:predicate anchor:anchor limit:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable sampleObjects, NSArray<HKDeletedObject *> * _Nullable deletedObjects, HKQueryAnchor * _Nullable newAnchor, NSError * _Nullable error) {
                /*...etc...*/
            }];
HKAnchoredObjectQuery*newQuery=[[HKAnchoredObjectQuery alloc]initWithType:quantityType谓词:谓词锚定:锚定限制:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery*\u非空查询,NSArray*\u可空采样对象,NSArray*\u可空删除对象,HKQueryAnchor*\u可空新锚定,NSError*\u可空错误) {
/*……等等*/
}];
我有时只看到部分数据,而不是全部数据。此外,我看到的数据中没有任何模式(它是块,不像我看到的所有最新或最早的数据)还有其他人遇到过这种情况吗?

这是我的确切密码:

- (void) getAllStoredDataForHKQuantityIdentifier:(NSString *)theHKIdentifier withCompletion:(void(^)(NSArray *results))completion startingFromAnchor: (HKQueryAnchor *)anchor {

    HKQuantityType *quantityType = [HKObjectType quantityTypeForIdentifier:theHKIdentifier];

    HKSourceQuery *sourceQuery = [[HKSourceQuery alloc] initWithSampleType:quantityType samplePredicate:nil completionHandler:^(HKSourceQuery *query, NSSet *sources, NSError *error) {
        if( error ) {
            completion(nil);
            return;
        }

        NSMutableSet *sourcesNo = [NSMutableSet new];
        for( HKSource *thisSource in sources ) {
            if( ![thisSource.bundleIdentifier isEqualToString:@"my.appname.app"] ) {
                [sourcesNo addObject:thisSource];
            }
        }

        for(HKSource* useSource in sourcesNo){

            NSPredicate *predicate = [HKQuery predicateForObjectsFromSources:[NSSet setWithObject:useSource]];

            HKAnchoredObjectQuery *newQuery = [[HKAnchoredObjectQuery alloc] initWithType:quantityType predicate:predicate anchor:anchor limit:HKObjectQueryNoLimit resultsHandler:^(HKAnchoredObjectQuery * _Nonnull query, NSArray<__kindof HKSample *> * _Nullable sampleObjects, NSArray<HKDeletedObject *> * _Nullable deletedObjects, HKQueryAnchor * _Nullable newAnchor, NSError * _Nullable error) {
                completion(sampleObjects);
            }];

            [healthStore executeQuery:newQuery];
        }
    }];

    [healthStore executeQuery:sourceQuery];
}
-(void)getAllStoredDataForHKQuantityIdentifier:(NSString*)带完成的HKIdentifier:(void(^)(NSArray*结果))完成开始自anchor:(HKQueryAnchor*)anchor{
HKQuantityType*quantityType=[HKObjectType quantityTypeForIdentifier:hkIdentifier];
HKSourceQuery*sourceQuery=[[HKSourceQuery alloc]initWithSampleType:quantityType samplePredicate:nil completionHandler:^(HKSourceQuery*query,NSSet*sources,NSError*error){
如果(错误){
完成(无);
返回;
}
NSMutableSet*sourcesNo=[NSMutableSet new];
对于(HKSource*来源中的此来源){
如果(![thisSource.bundleIdentifier IsequalString:@“my.appname.app”]){
[sourcesNo addObject:thisSource];
}
}
for(HKSource*sourcesNo中的useSource){
NSPredicate*谓词=[HKQuery PREDICTEFOBJECTS FROMSOURCES:[NSSet setWithObject:useSource]];
HKAnchoredObjectQuery*newQuery=[[HKAnchoredObjectQuery alloc]initWithType:quantityType谓词:谓词锚:锚限制:HKObjectQueryNoLimit结果处理程序:^(HKAnchoredObjectQuery*\u非空查询,NSArray*\u可空采样对象,NSArray*\u可空删除对象,HKQueryAnchor*\u可空新锚,NSError*\u可空错误){
完成(样本对象);
}];
[healthStore executeQuery:newQuery];
}
}];
[healthStore executeQuery:sourceQuery];
}

问题在于,您对所有执行的
HKAnchoredObjectQuery
实例使用相同的锚。它们有不同的谓词,因此如果重用单个锚,结果将毫无意义。有几种方法可以在不执行多个查询的情况下实现您在此代码段中尝试执行的操作。正如我在回答你的另一个问题时提到的,我建议你只使用一个
HKAnchoredObjectQuery
,然后通过查看你得到的
HKSamples
source
属性来处理结果

此外,将HKObjectQueryOnlimit与HKAnchoredObjectQuery和Active Energy等类型一起使用可能会非常危险。至少在较旧的iPhone上,我们的测试表明,在某些情况下,我们的一些用户的HealthKit数据库中显然存在一些奇怪的活性能量样本结构,因此他们在100天的时间内拥有100万个样本。在这种情况下,HKAnchoredObjectQuery只会卡在里面,永远不会返回到它的完成句柄。。。也许这是早期iOS es上的一个bug,现在已经修复了,但你永远不知道——在我们30万用户中,有100个是可以复制的。我们通过使用10万个样本限制而不是无限制来解决这个问题,然后在未达到限制时递归地进行这些锚定查询

您能否更具体地了解您正在看到的结果以及您希望看到的结果?您使用的数量类型和谓词是什么?你得到了多少结果?控制台输出中是否记录了任何有趣的内容?@Allan我正在尝试从另一个应用程序加载一长串用户的葡萄糖读数。我得到了一些但不是所有的读数,而且我没有得到读数的模式(这不是年表问题)。看看谓词是如何构造的,以及控制台中是否有任何记录,这仍然很有用。@Allan我已经发布了确切的代码。谢谢你的想法。问题是我找不到任何关于查询回调返回的锚点的详细文档。文件在哪里?你看过吗?你并不是要解释HKQueryAnchor的价值——它是对HealthKit内部使用内容的不透明引用。您只需保存查询返回结果时返回的锚点,然后在下次使用相同谓词执行相同查询时提供保存的锚点。感谢您的澄清,但您能否指出文档中指定的位置?它是一个不透明的类类型,因此对于如何正确使用它是不透明的。我认为没有比这更详细的文档了。你不确定使用锚的哪一部分?