Новый разработчик iOS здесь. Я искал ответ на это в документации по блокам и альтиметру, но я скоро приду. Я предполагаю, что есть какая-то простая вещь, которую я пропускаю, но не могу понять.Написание записей высотомера iPhone 6 для свойства класса массива внутри блока очереди?
У меня есть пользовательский класс под названием 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, так как давление выводится на консоль, линии «Давление 1», которая обращается к последнему объекту self.pressure. Однако кажется, что эти изменения не находятся за пределами этого блока, так как линия давления 2 выводит (null) на консоль, и похоже, что я ничего не могу сделать с помощью self.pressure вне этого блока.
Я пропустил что-то о том, как работают блоки? Мне просто нужен __блок где-нибудь? Я здесь совершенно не понимаю.
Addendum: self.altimeterIsAvailable определяется в других местах. Эта часть кода не должна иметь никаких проблем.
EDIT: ошибка оказалась в другом месте. Для будущих читателей, просматривающих этот пост, приведенный выше код должен быть вполне допустимым способом добавления в массив свойств в блоке.
startRelativeAltitudeUpdatesToQueue: withHandler: асинхронный метод, как и все асинхронные методы, он возвращается немедленно, до вызова обратно в обработчик, поэтому ваш журнал за пределами метода (@ «Pressure 2») печатается перед чтения обновляются. – rdelmar
Я думал, что это может иметь какое-то отношение к асинхронности метода, но я не думаю, что это вся история. Независимо от того, как долго я его запускаю, давление 2 всегда выводится (нулевое), даже если в консоли есть сотни успешных нажатий 1-го давления. Кроме того, если я распечатываю [self.pressure count] вне блока, он также возвращает 0. – surrix
Как и где вы создаете изменяемый массив? Когда вы позволяете ей работать долгое время, журнал «Давление 2» печатается несколько раз? – rdelmar