2011-10-23 10 views
30

Anche se ho qualche idea su cosa usare quando ma l'utilizzo esatto non mi è ancora chiaro. Qualcuno può spiegare con l'esempio ...? Grazie.KVO vs NSNotifica vs protocollo/delegati?

+3

Prova a leggere questo, è un articolo di blog davvero interessante sull'argomento per un punto di vista di un programmatore. http://blog.shinetech.com/2011/06/14/delegation-notification-and-observation/ – Daniel

risposta

36

Utilizzare un delegato se si desidera parlare con un solo oggetto. Ad esempio, una tabellaView ha un delegato - solo un oggetto dovrebbe essere responsabile per gestirlo.

Usa le notifiche se vuoi dire a tutti che qualcosa è successo. Ad esempio, in situazioni di memoria insufficiente viene inviata una notifica che informa la tua app dell'esistenza di un avviso di memoria. Poiché molti oggetti nella tua app potrebbero voler ridurre l'utilizzo della memoria, si tratta di una notifica.

Non penso che KVO sia una buona idea e cerco di non usarlo ma, se vuoi scoprire se una proprietà è cambiata, puoi ascoltare le modifiche.

Spero che questo aiuti.

PS This sums up why I think KVO is broken

+4

So che questo è vecchio, ma voglio ancora non essere d'accordo :) Questo articolo rende punti eccellenti. perché l'API KVO è rotta, ma afferma anche con precisione che è ancora uno strumento potente. Ci sono molte situazioni in cui è possibile salvare un sacco di codice brutto. Usalo con un wrapper come quello che ti ha fornito se vuoi, ma usalo. – Shinigami

+0

Utilizzare KVO quando gli osservatori necessitano di una risposta immediata. E uno può noi NSNotifications quando gli osservatori possono aspettare il ciclo degli eventi. – MANN

+0

@MANN Non credo di capire - le notifiche non sono asincrone, vengono anche attivate immediatamente (anche se non si ottengono le opzioni di willChange che si ottengono con KVO) – deanWombourne

12

Utilizzare un delegato quando c'è una relazione "master/slave" (delegato conosce la classe e la classe conosce il delegato), con una classe più in alto nella gerarchia di controllo, e quando si tratta di chiaro che non ci saranno situazioni in cui altri elementi (per lo più UI) saranno interessati a sapere cosa la classe ha da dire. Usa le notifiche quando la classe non è interessata a sapere chi ascolta e quante persone, chiunque e qualsiasi numero può registrarsi per le notifiche. KVO è utile per ascoltare "senza la conoscenza della classe", anche se ovviamente non è così, la classe su cui viene applicato KVO non ha bisogno di essere modificata.

2

La delega è un motivo di progettazione che viene utilizzato quando si desidera che un altro oggetto modifichi il comportamento del mittente. Esempio: le finestre di terminale evitano di mostrare linee o caratteri tagliati dai bordi della finestra, poiché il delegato della finestra terminale altera le dimensioni della finestra per garantire ciò.

La notifica è uno schema da utilizzare quando non è necessaria una risposta. Esempio: si riceve una notifica che il sistema sta per andare a dormire. Al mittente di quella notifica non importa cosa fai al riguardo.

1

A mio parere, KVO è migliore grazie ai suoi vantaggi zero-overhead. Le notifiche hanno un sovraccarico anche se non le stai usando/osservando. Per migliorare puoi usare NotificationCenters diversi, ma anche con quello ci sarà un overhead (correggimi se sbaglio). KVO è un po 'complesso ma vale la pena quando devi osservare molte cose.

+0

Quanto, in pratica, è il sovraccarico? – Liron

2

Anche quando tutti e tre avrebbero servire il vostro bisogno in una situazione, delegato sarebbe ancora una preferire un'opzione:

  1. riutilizzabilità.
  2. Auto documentato. Esaminando il file di intestazione della classe, si riconoscerebbe immediatamente cosa/come i dati scambiati in atto.
Problemi correlati