2009-12-18 3 views

risposta

94

La regola generale qui è quanti clienti vorrebbero essere avvisati di un evento. Se si tratta principalmente di un oggetto (ad esempio, per chiudere una vista o agire su un pulsante su cui è stato fatto clic o per reagire a un download non riuscito), è necessario utilizzare il modello delegato.

Se l'evento emesso può interessare a più oggetti contemporaneamente (ad esempio schermo ruotato, utilizzo della memoria, accesso utente/disconnessione), è necessario utilizzare lo NSNotificationCenter.

+25

Vorrei anche aggiungere che le notifiche sono a senso unico (ad es. 'DidFireMissle'), mentre un delegato è necessario se è necessario restituire informazioni (ad esempio,' - (BOOL) shouldFireMissle'). – benzado

+7

@ benzado: in realtà, è possibile passare un oggetto insieme a un messaggio, che i destinatari possono modificare. È necessario tenere presente che più destinatari (o zero) potrebbero gestire la notifica, ma è valida. –

34

loro scopi sono diversi:

  • notifica viene utilizzato per trasmettere messaggi a più destinatari possibilmente sconosciuti dal mittente.

  • delegazione viene utilizzato per inviare messaggi a un singolo destinatario noto che agisce per conto del mittente.

7

Considerando la performance è una buona idea (delegazione di meglio per numero limitato di oggetti notificati, Centro di notifica di meglio per un maggior numero di oggetti, o è? Eseguito un profiler), ma penso che un fattore più importante dal momento che si sta parlando Objective-C e meno probabile che stiano parlando delle parti ad alte prestazioni della vostra base di codice, che sono probabilmente scritte in C, sta riducendo le dipendenze in fase di compilazione tra i moduli.

Non c'è nulla che impedisca di avere una serie di delegati, piuttosto che un singolo delegato.

potrei usare NSNotificationCenter solo per lo stato di tutti i componenti dello stack di rete che faccio e le interfacce di monitoraggio dello stato del dispositivo personalizzato. Ma per la maggior parte dell'accoppiamento, che non ha a che fare con lo stato globale dell'app, penso che sia più chiaro usare i normali contratti di interfaccia in Objective-C nella maggior parte dei casi e più facile fuggire per le persone che ti seguono piuttosto che usare NSNotificationCenter. In realtà non ho mai usato NotificationCenter per i miei eventi personalizzati e preferisco usare i delegati per facilitare la comprensione del codice da parte di qualcun altro che legge il mio codice.

E infine, ovviamente con le notifiche da/verso l'API standard non hai scelta e devi utilizzare qualsiasi dei due metodi di Apple per un determinato evento.

11

Comunicazioni sono generalmente migliori per notificare l'interfaccia utente dei cambiamenti del verificarsi su altri thread pure. La documentazione di Apple scoraggia fortemente l'uso dei delegati sui thread, laddove possibile, sia per ragioni di stabilità che di prestazioni. Sul Mac, suggeriscono di utilizzare i binding, ma dal momento che non esistono su iPhone, le notifiche sono probabilmente la tua prossima migliore scommessa.

3

Un'opzione tra i due sta utilizzando il modello dell'osservatore senza NSNotificationCenter. Guarda la mia implementazione Objective-C here.

6

Le notifiche sono migliori per il disaccoppiamento dei componenti dell'interfaccia utente. Ti consente di collegare qualsiasi vista senza alcuna modifica nei tuoi controller o modelli. Decisamente migliore per un design liberamente accoppiato.

Ma per il prestazioni tra delega e la notifica, è necessario pensare circa la frequenza della chiamata.

La delega potrebbe essere migliore per eventi più frequenti, le notifiche sono migliori per eventi meno frequenti ma più destinatari. Dipende da cosa scegliere.