3

使用我的 6+,我一直在尝试使用 CoreMotion 的新 CMAAltmeter 读取相对高度和压力。但是回调永远不会触发。我有一个非常相似的设置,而是使用加速度计、陀螺仪和磁力计。他们似乎都工作正常。

想知道那里是否有人设法阅读?

- (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");
    }
}

我试过快速散步,但这里只有一个高度的故事可以失去/获得。

4

2 回答 2

10

我很尴尬以如此巨大的疏忽回答我自己的问题。

在原始帖子中,我在 viewDidLoad 的范围内声明了 CMAltimiter,因此它超出了范围并被释放。我将它移动为 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");
    }
}
于 2014-09-30T21:16:05.707 回答
-3

您需要调用[altimeterManager stopRelativeAltitudeUpdates];要释放到调度队列的引用。

于 2014-09-28T21:11:05.720 回答