Запись показаний высотомера iPhone 6 в свойство класса массива внутри блока очереди?

Новый разработчик 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, потому что давление выводится на консоль строкой "Pressure 1", которая обращается к последнему объекту self.pressure. Однако, кажется, что эти изменения не сохраняются вне этого блока, так как линия Pressure 2 выводит (ноль) на консоль, и, похоже, я ничего не могу сделать с self.pressure вне этого блока.

Я что-то упускаю из-за того, как блоки работают точно? Мне просто нужен __блок где-нибудь? Я в полном недоумении здесь.

Приложение: self.altimeterIsAvailable определено в другом месте. Эта часть кода не должна иметь никаких проблем.

РЕДАКТИРОВАТЬ: ошибка в конечном итоге в другом месте. Для будущих читателей, которые просматривают этот пост, приведенный выше код должен быть совершенно корректным способом добавления в массив свойств в блоке.

1 ответ

Это не ответ, но я хотел бы упомянуть об этом.

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) {
    ...
}];
Другие вопросы по тегам