5

Chciałbym zalogować wszelkie NSNotifications opublikowane przez jednego NSNotificationCenter udostępnionego w mojej aplikacji. Próbowałem podklasy NSNotificationCenter z zamiarem dodania kodu logowania do trzech metod post, ale zwraca instancji centrum CFNotification zamiast mojej podklasy.Rejestrowanie NSNotifications

Na pewno istnieje sposób monitorowania wysyłania do NSNotification?

EDIT/UPDATE

Jak dwie odpowiedzi poniżej prawidłowo wskazać mogę słuchać wszystkich powiadomień i rejestrować je w obsługi, ale sekwencja opiekun otrzyma tych powiadomień jest daleko od gwarancją taka sama jak sekwencja, w której zostały wysłane. Gdybym mógł być pewien, że handler będzie zawsze pierwszą osobą, która ma być powiadomiona, to zadziała, ale nie mogę: "Kolejność, w której obserwatorzy otrzymują powiadomienia, jest niezdefiniowana" Od NSNotification Docs

Odpowiedz

9

Używając - addObserver:selector:name:object: i przekazując nil zarówno dla name, jak i object, otrzymasz powiadomienie o każdym powiadomieniu.

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

Edit: jeśli chcesz dostać prawdziwą kolejność notyfikacje będąc wysłać, spróbuj instacji NSNotificationCenter i przesłanianie następujące metody:

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

Jeśli subclassing ma opcji możesz rozważyć zdefiniowanie kategorii na NSNotificationCenter, gdzie zastąpisz te metody wywołując superprefność. (Będziesz musiał użyć metody "swizzle", aby zadzwonić super w ramach kategorii). Powiedz mi, jeśli potrzebujesz pomocy.

+0

Dzięki. Ale problem polega na tym, że nie mogę zalogować się przed wysłaniem. Pozostaję do rejestrowania powiadomień po ich wysłaniu w charakterze obserwatora w dowolnej pozycji w kolejności powiadamiania obserwatorów. Jeśli mogę zalogować się w punkcie wysyłki, otrzymam znacznie jaśniejszy pomysł sekwencji powiadomień. Tego rodzaju globalny program nasłuchujący może nie zostać powiadomiony, dopóki poprzedni program obsługi nie uruchomi sekwencji zdarzeń, co oznacza, że ​​nie będę w stanie zobaczyć kolejności wysyłki, tylko kolejność, którą otrzymał dany obserwator. – Undistraction

+0

Sprawdź moją edycję;) –

+0

Dzięki. Problem polega na tym, że przy przydzielaniu/inicjowaniu NSNotificationCenter nie odzyskujesz centrum NSNotification. Dostajesz centrum CFNotificationCenter. To samo dotyczy podklasy NSNotificationCenter. Na pewno dodanie kategorii do NSNotificationCenter nie pomoże? – Undistraction

0

Powinieneś być w stanie użyć [addObserver: selektor własny: @selector (cokolwiek :) nazwa: nil object: nil] i po prostu wpisz swój kod logowania w cokolwiek: method. Obserwator ten powinien otrzymywać wszystkie powiadomienia wysłane przez Twoją aplikację (przynajmniej te wszystkie wysłane przez centrum domyślne).