2016-01-05 2 views
0

У меня странная проблема при чтении данных из healthkit. В первый раз, когда я нажимаю кнопку, вес печатается 0, в следующий раз я нажимаю кнопку, вес печатается как обычно. Я был бы очень признателен, если бы кто-то мог мне помочь. Спасибо!Healthkit: данные не отображаются в первый раз.

У меня есть следующий код.

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 

ответ

0

You U се одноточечно HealthKitManager но ваш код

HealthKitManager *readWeight = [[HealthKitManager sharedManager] init]; 

в IBAction readAgeButtonPressed должен быть

HealthKitManager *readWeight = [HealthKitManager sharedManager]; 

Вам не нужно инициализации.

Кроме того, вы можете изменить код

[[HealthKitManager sharedManager] requestAuthorization]; 

быть

HealthKitManager *readWeight = [HealthKitManager sharedManager]; 
[readWeight requestAuthorization]; 
NSLog(@"%.2f",readWeight.readWeight); 

проверки значения readWeight.

+0

Когда вы покидаете ** init **, проблема все еще существует. Но вторая часть ответа решила проблему. Похоже, что при первом считывании данных веса он возвращается обратно. Поэтому я поместил первые считанные данные в неиспользуемую переменную. Спасибо за вашу помощь! –

Смежные вопросы