1

Мне нужна помощь с NSNotificationCenter. У меня есть класс под названием Sensor и класс под названием SensorManager. Я бы хотел отправить уведомление от Sensor по адресу: SensorManager. В SensorManager я пишу этот код:Опубликовать уведомление в NSOperationQueue

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receiveTestNotification:) name:@"TestNotification" object:nil]; 

И, очевидно, у меня есть эта функция:

- (void) receiveTestNotification:(NSNotification *) notification 
{     
    if ([[notification name] isEqualToString:@"TestNotification"]) 
     NSLog (@"Successfully received the test notification!"); 
} 

В классе Sensor У меня есть функция, которая запускает датчик:

-(void)workSensor{    
     self.motionManager.accelerometerUpdateInterval = 0.05; 

     NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
     [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *data, NSError *error) {     
      [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; 

      NSLog(@"Udapte iphone acc data!"); 
     }]; 
    } 

} 

К сожалению, SensorManager не узнает уведомление. Странная вещь (с моей точки зрения) является то, что если я перееду код уведомления вне блока NSOperationQueue, все прекрасно работает (см ниже код):

-(void)workSensor{  
      //now the notification is here. Outside the block. 
      [[NSNotificationCenter defaultCenter] postNotificationName:@"TestNotification" object:self]; 

      self.motionManager.accelerometerUpdateInterval = 0.05; 

      NSOperationQueue *queue = [[NSOperationQueue alloc]init]; 
      [self.motionManager startAccelerometerUpdatesToQueue:queue withHandler:^(CMAccelerometerData *data, NSError *error) {     


       NSLog(@"Udapte iphone acc data!"); 
      }]; 
     } 

    } 

Как я могу поместить отправитель уведомления внутри NSOperationQueue блок? Спасибо!

+0

Вы видите сообщение «Udapte iphone acc data» при запуске приложения? То есть вообще-то называется обработчик? Кроме того, вы отредактировали свой ключ уведомления при публикации вопроса? I.e., возможно ли, что вы ошибочно указали имя уведомления в своем фактическом коде? (Кстати, вы можете избежать этой проблемы, не используя отдельные строковые литералы, а скорее иметь единственную глобальную константу, на которую ссылаетесь как при публикации, так и при обработке уведомления.) – Rob

+0

Да, я вижу «Обновление данных iphone acc», и нет, к сожалению, нет ошибки во имя уведомления ... Спасибо, что помогли мне! – superpuccio

+0

np. Итог, нет проблем с отправкой уведомлений из очереди операций, поэтому это должно быть что-то еще. Если у вас все еще есть проблемы, создайте [MCVE] (http://stackoverflow.com/help/mcve) с нуля, какой-то минимальный пример, который воспроизводит описанную вами проблему. Я не могу воспроизвести вашу проблему (предполагая, что проблема находится в другом месте вашего кода), но если вы дадите нам проверенный пример, мы можем помочь вам дальше. – Rob

ответ

0

Уведомление должно быть размещено на главном потоке, так что вы должны что-то вроде этого:

[self performSelectorOnMainThread:@selector(sendNotification) withObject:nil waitUntilDone:YES]; 

, который будет вызывать функцию на главном потоке. Затем определите функцию отправки уведомлений:

- (void)sendNotification { 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myEventName" object:self]; 
} 
+0

Нет, уведомления не обязательно должны быть опубликованы из основного потока, хотя часто бывает полезно сделать это. BTW, в другом обсуждении, OP настаивает на том, что он попытался отправить сообщение уведомления в основной поток, и это не решило его проблему. Итог, я не считаю, что публикация уведомления из основного потока решает проблему OP. Кроме того, если мы хотим сделать это уведомление в основном потоке, использование GCD - это более простой способ сделать это (например, 'dispatch_async (dispatch_get_main_queue(),^{...});'). – Rob

Смежные вопросы