2009-11-12 3 views
1

NSWorkspace의 NSNotificationCenter에서 알림을 관찰하기 위해 Snow Leopard의 새로운 블록 기반 API에 약간의 문제가있었습니다.Snow Leopard의 NSWorkspace 및 NSNotificationCentre의 블록 기반 API 관련 문제

기존 선택기 기반 방법을 사용하여 알림을 등록한 경우 원하는 알림을 볼 수 있습니다. 블록을 사용하는 새로운 메소드를 사용하려고하면 작동하지 않습니다.

아래 코드 블록에서 BlockNotifications를 YES 또는 NO로 설정하면 앱이 실행될 때 콘솔에 "didReceiveNoticationTest : called"가 출력되지만 동일한 메시지가 표시 될 때까지 메시지가 표시되지 않습니다. 예.

내가 잘못하고있는 것에 대한 제안 사항이 있으십니까?

-(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"); 
} 

답변

3

나는 일찌기 버그이다.

다음 코드는 두 가지 알림을 모두 인쇄합니다. 선택기 버전을 제거하면 아무 것도 인쇄되지 않습니다. 블록 버전을 제거하면 선택기 버전이 여전히 인쇄됩니다.

-(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

감사합니다. 나는 애플에게 버그를 제기했다. –

0

특이 부분이 방법에 대한 설명서를 재 읽기 :

반환 값

목적 또는 NSObject의 프로토콜 을 준수한다.

당신은 당신은 알림 센터에 존재 에 등록을 원하는만큼 반환 된 값을 유지해야합니다.

+0

그가하는 일. "[_notifcationObserver retain];" –

관련 문제