Объединение при использовании NSNotificationQueue - PullRequest
1 голос
/ 12 января 2011

Я написал следующий код для объединения, используя 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 ]

6 голосов
/ 20 января 2011

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

Чтобы увидеть это, измените 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 при опросах.

0 голосов
/ 04 июля 2012

Вы должны «отменить регистрацию» уведомления; попробуйте это:

-(void)dealloc
{    
    [[NSNotificationCenter defaultCenter]removeObserver:self name:@"async000" object:nil];

    [super dealloc];
}
...