0

新的 iOS 开发者在这里。我一直在关于积木和高度计的文档中寻找答案,但我做不到。我认为我缺少一些简单的东西,但无法弄清楚。

我有一个名为 PressureSensor 的自定义类。简单来说,这个类有一个属性:

@property (nonatomic, strong, readwrite) NSMutableArray *pressure;

我将高度计中的 NSNumber 值加载到这个数组中。

该类的初始化程序是:

- (instancetype)init
{
    self = [super init];

    if (self)
    {
        if (self.altimeterIsAvailable)
        {
            NSOperationQueue *queue = [[NSOperationQueue alloc] init];
            [self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
                dispatch_async(dispatch_get_main_queue(), ^ {

                    [self.pressure addObject:altitudeData.pressure];

                    NSLog(@"Pressure 1: %@", [self.pressure lastObject]);
                });
            }];
            NSLog(@"Pressure 2: %@", [self.pressure lastObject]);
        }
    }
    return self;
}

当我在手机上运行应用程序时,我假设压力已成功添加到 self.pressure 数组中,因为压力是通过访问 self.pressure 的 lastObject 的“压力 1”行打印到控制台的。但是,这些更改似乎不适用于此块之外,因为 Pressure 2 行输出(null)到控制台,并且似乎我无法在此块之外使用 self.pressure 做任何事情。

我是否错过了有关块如何工作的信息?我只需要一个 __block 某处吗?我在这里完全不知所措。

附录:self.altmeterIsAvailable 在别处定义。那部分代码应该没有任何问题。

编辑:错误最终出现在其他地方。对于浏览这篇文章的未来读者,上面的代码应该是添加到块中的属性数组的一种完全有效的方法。

4

1 回答 1

0

这不是答案,但我想提一下。

NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    dispatch_async(dispatch_get_main_queue(), ^ {
        ...
    });
 }];

创建一个队列,并将 dispatch_async 发送到主队列。这是多余的。您可以直接使用 NSOperationQueue +mainQueue 方法。

NSOperationQueue *queue = [NSOperationQueue mainQueue];
[self.altimeter startRelativeAltitudeUpdatesToQueue:queue withHandler:^(CMAltitudeData *altitudeData, NSError *error) {
    ...
}];
于 2014-12-23T19:24:51.807 回答