Объединение при использовании NSNotificationQueue
Я написал следующий код, чтобы выполнить объединение с использованием NSNotificationQueue. Я хочу опубликовать только одно уведомление, даже если событие происходит несколько раз.
- (void) test000AsyncTesting
{
[NSRunLoop currentRunLoop];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(async000:) name:@"async000" object:self];
[[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotification notificationWithName:@"async000" object:self]
postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
while (i<2)
{
[[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.0]];
NSLog(@"Polling...");
i++;
}
}
- (void) async000:(NSNotification*)notification;
{
NSLog(@"NSNotificationQueue");
}
Каждый раз при вызове метода test000AsyncTesting уведомления с одинаковым именем добавляются в очередь. Согласно концепции объединения, если в очереди есть любое количество уведомлений, но с тем же именем, то она будет опубликована только один раз. Но когда я запускаю свой код, "async000:" вызывается несколько раз, что точно равно количеству уведомлений, добавленных в NSNotificationQueue. Я думаю, что объединение не работает.
Для меня выполнение кода остается одинаковым в обоих случаях:
Случай 1: [[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotificationtificationWithName:@"async000" объект:self] postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
Случай 2: [[NSNotificationQueue defaultQueue] enqueueNotification: [NSNotificationtificationWithName:@"async000" объект:self] postingStyle:NSPostWhenIdle];
Пожалуйста, сообщите об ошибке в моем коде.
2 ответа
Объединение только объединяет уведомления, которые появляются, пока поток управления не возвращается в цикл выполнения. Если вы поставите уведомление в очередь на последующее отключение через цикл выполнения, это приведет к отдельному вызову уведомления.
Чтобы увидеть это, измените test000AsyncTesting, чтобы поставить в очередь 2 уведомления следующим образом:
[[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotification notificationWithName:@"async000" object:self]
postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
[[NSNotificationQueue defaultQueue] enqueueNotification:[NSNotification notificationWithName:@"async000" object:self]
postingStyle:NSPostWhenIdle coalesceMask:NSNotificationCoalescingOnName forModes:nil];
затем async000
будет вызываться только один раз при опросе.
Для тестирования измените coalesceMask на NSNotificationNoCoalescing, тогда вы увидите 2 вызова async000 при опросах.
Вы должны "отменить регистрацию" уведомления; попробуй это:
-(void)dealloc
{
[[NSNotificationCenter defaultCenter]removeObserver:self name:@"async000" object:nil];
[super dealloc];
}