CMAltimeter обратный вызов никогда не срабатывает

Используя мой 6+, я пытался прочитать относительную высоту и давление с помощью нового CMAltimeter CoreMotion. Однако обратный вызов никогда не срабатывает. У меня очень похожая установка, в которой вместо этого используются акселерометры, гироскопы и магнитометры. Кажется, все они работают нормально.

Интересно, удалось ли кому-нибудь там почитать?

- (void)viewDidLoad {
    [super viewDidLoad];

    if([CMAltimeter isRelativeAltitudeAvailable]){
        CMAltimeter *altimeterManager = [[CMAltimeter alloc]init];
        [altimeterManager startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
            // This never fires.
            NSString *data = [NSString stringWithFormat:@"Altitude: %f %f", altitudeData.relativeAltitude.floatValue, altitudeData.pressure.floatValue];
            NSLog(@"%@", data);
            self.altimeterLabel.text = data;
        }];
        NSLog(@"Started altimeter");
        self.altimeterLabel.text = @"-\n-";
    } else {
        NSLog(@"Altimeter not available");
    }
}

Я попытался быстро прогуляться, но здесь есть только одна история высоты, которую можно потерять.

2 ответа

Решение

Я довольно смущен, чтобы ответить на мой собственный вопрос с таким огромным упущением.

В оригинальном посте я объявил CMAltimiter в области видимости ViewDidLoad, таким образом, он выходит из области видимости и освобождается. Я переместил это, чтобы быть iVar, и обратный вызов теперь срабатывает.

#import "ViewController.h"
@import CoreMotion;

@interface ViewController ()
@property (nonatomic, strong) CMAltimeter *altimeterManager;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    if([CMAltimeter isRelativeAltitudeAvailable]){
        self.altimeterManager = [[CMAltimeter alloc]init];
        [self.altimeterManager startRelativeAltitudeUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
            // This now fires properly
            NSString *data = [NSString stringWithFormat:@"Altitude: %f %f", altitudeData.relativeAltitude.floatValue, altitudeData.pressure.floatValue];
            NSLog(@"%@", data);
            self.altimeterLabel.text = data;
        }];
        NSLog(@"Started altimeter");
        self.altimeterLabel.text = @"-\n-";
    } else {
        NSLog(@"Altimeter not available");
    }
}

Вам нужно позвонить [altimeterManager stopRelativeAltitudeUpdates]; для ссылок, которые будут выпущены в очередь отправки.

Другие вопросы по тегам