5

단일 NSNotificationCenter에서 게시 한 NSNotifications를 내 응용 프로그램 전체에 걸쳐 기록하고 싶습니다. 세 가지 게시물 메서드에 로깅 코드를 추가하려는 의도로 NSNotificationCenter 서브 클래 싱을 시도했지만 내 하위 클래스 대신 CFNotification 센터의 인스턴스를 반환합니다.로깅 NSNotifications

확실하게 NSNotification 게시를 모니터링하는 방법이 있습니까?

EDIT/UPDATE이 개 답변으로

아래 제대로 나는 모든 알림을 듣고 핸들러에서 그들을 기록하지만, 이러한 알림을받을 수있는 핸들러까지 보장으로부터 순서가 동일 할 수 지적 그들이 발송 된 순서. 핸들러가 항상 통지를받을 수있는 첫 번째 핸들러가 될 수 있는지 확신 할 수는 있지만 다음과 같이 할 수는 없습니다. '관찰자가 알림을받는 순서'가 정의되지 않음 From from NSNotification Docs

답변

9

을 사용하고 nameobject 모두에 nil을 전달하면 알림이 전송됩니다.

- (id)init 
{ 
    self = [super init]; 
    if (self != nil) 
    { 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(log:) name:nil object:nil]; 
    } 
    return self; 
} 

- (void)log:(NSNotification *)notification 
{ 
    NSLog(@"%@", notification); 
} 

편집 : 당신은 알림 NSNotificationCenter를 하위 클래스 다음과 같은 방법을 재정의하려고, 전송되는 실제 순서 얻으려면 : 서브 클래스가에 대한 옵션이없는 경우

– postNotification: 
– postNotificationName:object: 
– postNotificationName:object:userInfo: 

을 당신은 NSNotificationCenter에 범주를 정의하는 것을 고려해 볼 수 있습니다. 여기서 super 구현을 호출하여이 메서드를 재정의 할 수 있습니다. (당신은 카테고리 내에서 super를 호출하기 위해 메소드를 swizzle 할 필요가있을 것이다). 그렇게하는 데 도움이 필요하면 알려주세요.

+0

감사합니다. 하지만 문제는 내가 미리 보내기를 기록 할 수 없다는 것입니다. 나는 통보받는 관찰자의 순서에서 임의의 위치에 옵서버로 파견 된 후에 통보 로그에 남는다. 디스패치 지점에서 로그 할 수 있다면 알림 시퀀스에 대한 훨씬 더 명확한 아이디어를 얻을 수 있습니다. 이러한 종류의 글로벌 리스너는 이전 처리기가 일련의 이벤트를 트리거 할 때까지 알림을받지 못할 수 있습니다. 즉, 디스패치 순서를 볼 수 없으며이 특정 관찰자에게받은 순서 만 표시됩니다. – Undistraction

+0

내 편집 확인;) –

+0

감사. 문제는 NSNotification 센터를 할당/초기화 할 때 NSNotification 센터를 다시 얻지 못한다는 것입니다. CFNotificationCenter를받습니다. NSNotificationCenter의 하위 클래스도 마찬가지입니다. NSNotificationCenter에 카테고리를 추가하면 도움이되지 않을까요? – Undistraction

0

[addObserver : 셀렉터 : @selector (whatever :) name : nil object : nil] 그리고 로깅 코드를 whatever : 메소드에 넣으십시오. 이 관찰자는 앱에 게시 된 모든 알림 (적어도 기본 센터에서 게시 한 모든 알림)을 받아야합니다.