Запись показаний высотомера 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) {
...
}];