Объединение при использовании 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];
}
Другие вопросы по тегам