Domanda

Questa non è una domanda tanto come un avvertimento per gli altri per salvarli po 'di tempo.

NSNotificationCenter su iOS 3 / iPhone OS 3 (Sto assumendo anche Mac OS X e iOS 4) ha il seguente comportamento:

Se ti registri più volte per la notifica specifica esatta, NSNotificationCenter sarà non riconoscere la ridondanza e invece sparerà fuori come molti notifiche a voi come avete registrato un'osservazione per.

Questa è quasi mai il comportamento che si desidera vedere, ed è quasi sempre accidentale.

Esempio:

Voglio che il mio controller della vista per ricevere notifiche da un oggetto di rete Singleton quando nuovi dati è disponibile in:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

, ma in precedenza avevo già messo la stessa cosa in viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

Si noti che è esattamente la stessa notifica, risolvendo allo stesso osservatore, il mittente e la notifica nome.

In questo caso, se non rimuovere una di quelle chiamate addObserver, vado a prendere le notifiche duplicate al mio controller della vista.

In un ambiente multi-threaded, questo è un mondo di male. Fidati di me.

Basta mettere questo là fuori nel caso in cui non vi sono altri che si trasformano in qualcosa di simile.

È stato utile?

Soluzione

NSNotificationCenter su iOS 3 / iPhone OS 3 (Sto assumendo anche Mac OS X e iOS 4) ha il seguente comportamento:

Se ti registri più volte per la notifica specifica esatta, NSNotificationCenter sarà non riconoscere la ridondanza e invece sparerà fuori come molti notifiche a voi come avete registrato un'osservazione per.

Questa è quasi mai il comportamento che si desidera vedere, ed è quasi sempre accidentale.

Esempio:

Voglio che il mio controller della vista per ricevere notifiche da un oggetto di rete Singleton quando nuovi dati è disponibile in:

- (void) viewDidLoad 
{
    [super viewDidLoad];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:) 
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

, ma in precedenza avevo già messo la stessa cosa in viewWillAppear:

- (void) viewWillAppear
{
    [super viewWillAppear];

    [[NSNotificationCenter defaultCenter] addObserver:self
            selector:@selector(newDataArrived:)
                name:NewDataArrivedNotification
              object:[NetworkListener sharedNetworkListener]];
}

Si noti che è esattamente la stessa notifica, risolvendo allo stesso osservatore, il mittente e la notifica nome.

In questo caso, se non rimuovere una di quelle chiamate addObserver, vado a prendere le notifiche duplicate al mio controller della vista.

In un ambiente multi-threaded, questo è un mondo di male. Fidati di me.

Basta mettere questo là fuori nel caso in cui non vi sono altri che si trasformano in qualcosa di simile.

Altri suggerimenti

Si dovrebbe sempre e ripulire i osservatori.
Il modo più semplice per farlo è: [[NSNotificationCenter defaultCenter] removeObserver: auto]
viewDidLoad non è un buon posto per aggiungere osservatori, perché questo funzioni possono ottenere chiamato più volte, questo accade quando viewDidUnload viene attivato. Un buon posto per mettere le addObservers in viewWillAppear e removeObservers in viewWillDisappear.

Come hai detto tu stesso, NSNotificationCenter non fa controllo sui duplicati, che può essere fastidioso per alcuni, ma ha senso quando concidering il sistema completo dietro di esso.

La stessa logica vale per l'aggiunta di obiettivi a determinati oggetti, ma spesso c'è un riconoscimento della chiave su quelli.

Grazie per l'intuizione, e per una buona, avvertimento SEO-friendly:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top