1

Я пытаюсь выполнить селектор при наступлении определенных событий, таких как:Выполните селектор только один раз при получении двух или более уведомлений

  1. приложение становится активным изменения
  2. Интернет статуса достижимости от не доступен для достижимы

Я отправляю уведомление, когда эти события происходят с помощью следующего кода

[[NSNotificationCenter defaultCenter] postNotificationName:Notif_Name object:nil]; 

и я хочу, чтобы выполнить селектор, когда уведомление принимается в том же UIViewController инстанции, так что я его регистрации в качестве наблюдателя в viewDidLoad

[[NSNotificationCenter defaultCenter] addObserverForName:Notif_Name object:nil queue:nil usingBlock:^(NSNotification *note) { 

    [self performSelectorOnMainThread:@selector(selectorName) withObject:nil waitUntilDone:NO]; 
}]; 

Теперь эти события я наблюдающие может произойти одновременно. Как я могу убедиться, что мой селектор выполняется только один раз?

ответ

0

Вы можете сохранить флаг, указывающий, выполнено ли selectorName и защищено от многопоточного доступа.

@interface ViewController() 
@property (nonatomic) BOOL executed; 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(executeSelector) name:Notif_Name object:nil]; 
} 

- (void)executeSelector { 
    @synchronized (self) { 
     if (!self.executed) { 
      self.executed = YES; 
      [[NSNotificationCenter defaultCenter] removeObserver:self]; 
      [self performSelectorOnMainThread:@selector(selectorName) withObject:nil waitUntilDone:NO]; 
     } 
    } 
} 

@end 
0

вы можете попробовать следующее:

[[NSNotificationCenter defaultCenter] addObserverForName:Notif_Name object:nil queue:nil usingBlock:^(NSNotification *note) { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(selectorName) object:nil]; 
    [self performSelector:@selector(selectorName) withObject:nil afterDelay:1.0]; 
}]; 

вы подождать секунду, пока вы не выполните действия и отменить все ожидающие запросы ...

1

Коалесцентных уведомлений поддерживаются NSNotificationQueue в Cocoa Touch.

Вместо того, чтобы использовать уведомление , центр, чтобы публиковать уведомление напрямую, поставить в очередь уведомление и сообщить очереди, чтобы объединить похожие или идентичные уведомления. Его можно совместить на основе одного или обоих из имени уведомления и отправителя. Вы не предоставляете объект для уведомления, поэтому вы можете объединять только имя.

NSNotification * note = [NSNotification notificationWithName:Notif_Name object:nil] 

[[NSNotificationQueue defaultQueue] enqueueNotification:note 
              postingStyle:NSPostASAP 
              coalesceMask:NSNotificationCoalescingOnName 
               forModes:nil]; 

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

  • Нет связанных вопросов^_^