2014-12-21 9 views
0

Новый разработчик 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: ошибка оказалась в другом месте. Для будущих читателей, просматривающих этот пост, приведенный выше код должен быть вполне допустимым способом добавления в массив свойств в блоке.

+1

startRelativeAltitudeUpdatesToQueue: withHandler: асинхронный метод, как и все асинхронные методы, он возвращается немедленно, до вызова обратно в обработчик, поэтому ваш журнал за пределами метода (@ «Pressure 2») печатается перед чтения обновляются. – rdelmar

+0

Я думал, что это может иметь какое-то отношение к асинхронности метода, но я не думаю, что это вся история. Независимо от того, как долго я его запускаю, давление 2 всегда выводится (нулевое), даже если в консоли есть сотни успешных нажатий 1-го давления. Кроме того, если я распечатываю [self.pressure count] вне блока, он также возвращает 0. – surrix

+0

Как и где вы создаете изменяемый массив? Когда вы позволяете ей работать долгое время, журнал «Давление 2» печатается несколько раз? – rdelmar

ответ

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) { 
    ... 
}];