Healthkit:第一次没有显示数据 运行。
Healthkit: Data not showing first time running.
从 healthkit 读取数据时遇到一个奇怪的问题。第一次按下按钮时,重量打印为 0,下次按下按钮时,重量打印为 normal.I 如果有人能帮助我,我将不胜感激。
谢谢!
我有以下代码。
HealtkitManager.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <HealthKit/HealthKit.h>
@interface HealthKitManager : NSObject
@property (nonatomic) float weight;
@property (nonatomic) HKHealthStore *healthStore;
+(HealthKitManager *)sharedManager;
-(void) requestAuthorization;
-(double) readWeight;
@end
Healthkitmanager.m
#import "HealthKitManager.h"
#import <healthKit/healthKit.h>
#import "StartScreen.h"
@interface HealthKitManager ()
@end
@implementation HealthKitManager
+(HealthKitManager *) sharedManager{
static dispatch_once_t pred = 0;
static HealthKitManager *instance = nil;
dispatch_once(&pred, ^{
instance = [[HealthKitManager alloc]init];
instance.healthStore = [[HKHealthStore alloc]init];
});
return instance;
}
-(void)requestAuthorization {
if([HKHealthStore isHealthDataAvailable]==NO){
return;
}
NSArray *readTypes = @[[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMassIndex],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyFatPercentage]];
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithArray:readTypes] completion:nil];
}
-(double) readWeight{
NSMassFormatter *massFormatter = [[NSMassFormatter alloc]init];
massFormatter.unitStyle = NSFormattingUnitStyleLong;
HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
[self fetchMostRecentDataOfQuantityType:weightType withCompletion:^(HKQuantity *mostRecentQuantity, NSError *error) {
if(!mostRecentQuantity){
NSLog(@"%@",@"Error. ");
}
else{
HKUnit *weightUnit = [HKUnit gramUnit];
_weight = [mostRecentQuantity doubleValueForUnit:weightUnit];
_weight = (float)_weight/1000.00f;
}
}];
return _weight;
}
- (void)fetchMostRecentDataOfQuantityType:(HKQuantityType *)quantityType withCompletion:(void (^)(HKQuantity *mostRecentQuantity, NSError *error))completion {
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:quantityType predicate:nil limit:1 sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
if (!results) {
if (completion) {
completion(nil, error);
}
return;
}
if (completion) {
HKQuantitySample *quantitySample = results.firstObject;
HKQuantity *quantity = quantitySample.quantity;
completion(quantity, error);
}
}];
[self.healthStore executeQuery:query];
}
@end
Startscreen.m
#import "StartScreen.h"
#import "HealthKitManager.h"
@interface StartScreen ()
@property(nonatomic,weak) IBOutlet UILabel *weightLabel;
@end
@implementation StartScreen
- (void)viewDidLoad {
[super viewDidLoad];
[[HealthKitManager sharedManager] requestAuthorization];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)readAgeButtonPressed:(id)sender{
HealthKitManager *readWeight = [[HealthKitManager sharedManager] init];
NSLog(@"%.2f",readWeight.readWeight);
}
@end
你使用单例 HealthKitManager 但你的代码
HealthKitManager *readWeight = [[HealthKitManager sharedManager] init];
在 IBAction readAgeButtonPressed 中应该是
HealthKitManager *readWeight = [HealthKitManager sharedManager];
你不需要init.
此外,您可以更改代码
[[HealthKitManager sharedManager] requestAuthorization];
成为
HealthKitManager *readWeight = [HealthKitManager sharedManager];
[readWeight requestAuthorization];
NSLog(@"%.2f",readWeight.readWeight);
正在检查 readWeight 的值。
从 healthkit 读取数据时遇到一个奇怪的问题。第一次按下按钮时,重量打印为 0,下次按下按钮时,重量打印为 normal.I 如果有人能帮助我,我将不胜感激。 谢谢!
我有以下代码。
HealtkitManager.h
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <HealthKit/HealthKit.h>
@interface HealthKitManager : NSObject
@property (nonatomic) float weight;
@property (nonatomic) HKHealthStore *healthStore;
+(HealthKitManager *)sharedManager;
-(void) requestAuthorization;
-(double) readWeight;
@end
Healthkitmanager.m
#import "HealthKitManager.h"
#import <healthKit/healthKit.h>
#import "StartScreen.h"
@interface HealthKitManager ()
@end
@implementation HealthKitManager
+(HealthKitManager *) sharedManager{
static dispatch_once_t pred = 0;
static HealthKitManager *instance = nil;
dispatch_once(&pred, ^{
instance = [[HealthKitManager alloc]init];
instance.healthStore = [[HKHealthStore alloc]init];
});
return instance;
}
-(void)requestAuthorization {
if([HKHealthStore isHealthDataAvailable]==NO){
return;
}
NSArray *readTypes = @[[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMassIndex],
[HKObjectType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyFatPercentage]];
[self.healthStore requestAuthorizationToShareTypes:nil readTypes:[NSSet setWithArray:readTypes] completion:nil];
}
-(double) readWeight{
NSMassFormatter *massFormatter = [[NSMassFormatter alloc]init];
massFormatter.unitStyle = NSFormattingUnitStyleLong;
HKQuantityType *weightType = [HKQuantityType quantityTypeForIdentifier:HKQuantityTypeIdentifierBodyMass];
[self fetchMostRecentDataOfQuantityType:weightType withCompletion:^(HKQuantity *mostRecentQuantity, NSError *error) {
if(!mostRecentQuantity){
NSLog(@"%@",@"Error. ");
}
else{
HKUnit *weightUnit = [HKUnit gramUnit];
_weight = [mostRecentQuantity doubleValueForUnit:weightUnit];
_weight = (float)_weight/1000.00f;
}
}];
return _weight;
}
- (void)fetchMostRecentDataOfQuantityType:(HKQuantityType *)quantityType withCompletion:(void (^)(HKQuantity *mostRecentQuantity, NSError *error))completion {
NSSortDescriptor *timeSortDescriptor = [[NSSortDescriptor alloc] initWithKey:HKSampleSortIdentifierEndDate ascending:NO];
HKSampleQuery *query = [[HKSampleQuery alloc] initWithSampleType:quantityType predicate:nil limit:1 sortDescriptors:@[timeSortDescriptor] resultsHandler:^(HKSampleQuery *query, NSArray *results, NSError *error) {
if (!results) {
if (completion) {
completion(nil, error);
}
return;
}
if (completion) {
HKQuantitySample *quantitySample = results.firstObject;
HKQuantity *quantity = quantitySample.quantity;
completion(quantity, error);
}
}];
[self.healthStore executeQuery:query];
}
@end
Startscreen.m
#import "StartScreen.h"
#import "HealthKitManager.h"
@interface StartScreen ()
@property(nonatomic,weak) IBOutlet UILabel *weightLabel;
@end
@implementation StartScreen
- (void)viewDidLoad {
[super viewDidLoad];
[[HealthKitManager sharedManager] requestAuthorization];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
-(IBAction)readAgeButtonPressed:(id)sender{
HealthKitManager *readWeight = [[HealthKitManager sharedManager] init];
NSLog(@"%.2f",readWeight.readWeight);
}
@end
你使用单例 HealthKitManager 但你的代码
HealthKitManager *readWeight = [[HealthKitManager sharedManager] init];
在 IBAction readAgeButtonPressed 中应该是
HealthKitManager *readWeight = [HealthKitManager sharedManager];
你不需要init.
此外,您可以更改代码
[[HealthKitManager sharedManager] requestAuthorization];
成为
HealthKitManager *readWeight = [HealthKitManager sharedManager];
[readWeight requestAuthorization];
NSLog(@"%.2f",readWeight.readWeight);
正在检查 readWeight 的值。