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];
для ссылок, которые будут выпущены в очередь отправки.