2009-11-12 9 views
1

J'ai eu des problèmes avec la nouvelle API basée sur des blocs de Snow Leopard pour observer les notifications de NSNotificationCenter de NSWorkspace.Problème avec NSWorkspace et l'API basée sur des blocs de NSNotificationCentre dans Snow Leopard

Si je m'inscris pour des notifications en utilisant la méthode traditionnelle basée sur le sélecteur, alors je suis capable d'observer la notification désirée. Si j'essaie d'utiliser la nouvelle méthode qui prend un bloc, cela ne fonctionne pas. Dans le bloc de code ci-dessous, le paramètre usingBlockNotifications sur YES ou NO devrait produire le même résultat, à savoir "didReceiveNoticationTest: called" imprimé sur la console lors du lancement d'une application, mais je ne reçois pas le message lorsqu'il est défini sur OUI.

Des suggestions sur ce que je fais mal?

-(void)awakeFromNib 

{ 

BOOL usingBlockNotifications = YES; 

_notifcationObserver = nil; 
NSNotificationCenter *nc = [[NSWorkspace sharedWorkspace] notificationCenter]; 

if (usingBlockNotifications) 
{ 
    _notifcationObserver = 
    [nc addObserverForName:NSWorkspaceDidLaunchApplicationNotification 
     object:[NSWorkspace sharedWorkspace] 
     queue:nil 
    usingBlock:^(NSNotification *arg1) { 
     [self didReceiveNoticationTest:arg1]; 
    }]; 
    [_notifcationObserver retain]; 
} else { 
    [nc addObserver:self 
     selector:@selector(didReceiveNoticationTest:) 
     name:NSWorkspaceDidLaunchApplicationNotification 
    object:[NSWorkspace sharedWorkspace]]; 
} 

} 

-(void)didReceiveNoticationTest:(NSNotification *)notification 
{ 
NSLog(@"didReceiveNoticationTest: called"); 
} 

Répondre

3

Je suppose que c'est un bug.

Le code suivant imprime les deux notifications. Si vous supprimez la version du sélecteur, rien n'est imprimé. Si vous supprimez la version de bloc, la version du sélecteur s'imprime toujours.

-(void)didReceiveNoticationTest1:(NSNotification *)notification 
{ 
    NSLog(@"1: didReceiveNoticationTest: called"); 
} 
-(void)didReceiveNoticationTest2:(NSNotification *)notification 
{ 
    NSLog(@"2: didReceiveNoticationTest: called"); 
} 

-(void)awakeFromNib 

{ 
    NSNotificationCenter *nc = [[NSWorkspace sharedWorkspace] notificationCenter]; 

    [nc addObserver:self 
      selector:@selector(didReceiveNoticationTest1:) 
       name:NSWorkspaceDidLaunchApplicationNotification 
      object:[NSWorkspace sharedWorkspace]]; 

    [[nc addObserverForName:NSWorkspaceDidLaunchApplicationNotification 
        object:[NSWorkspace sharedWorkspace] 
         queue:nil 
       usingBlock:^(NSNotification* arg1) 
          { 
           [self didReceiveNoticationTest2:arg1]; 
          }] retain]; // this will leak. 
} 
+0

Merci pour cela - content que ce ne soit pas seulement moi! J'ai déposé un bug avec Apple. –

0

relire la documentation de ce procédé, en particulier la partie:

Valeur de retour

Un objet ou conforme au protocole NSObject.

Vous devez conserver la valeur retournée comme que vous voulez que l'inscription existe dans le centre de notification.

+0

Ce qu'il fait. "' [_notifcationObserver conserve]; "" –