2011-09-01 7 views
7

Utilizzo il delegato dell'app come "bucket globale" per condividere i dati tra vari controller di visualizzazione. In genere faccio qualcosa di simile:iOS che condivide i "dati globali" tra i controller delle viste

My_AppDelegate *appDelegate = (My_AppDelegate *)[[UIApplication sharedApplication] delegate]; 

E poi, vorrei bastone dati nel AppDelegate, e raccogliere i dati dal AppDelegate con un altro controller della vista. In qualche modo, questo sembra maldestro e inappropriato (anche se funziona).

C'è un modo migliore? Posso impostare un "ascoltatore" su una sorta di area di condivisione globale, se qualcuno inserisce un elemento di dati, un altro oggetto riceverebbe un "richiamo" per far sapere che qualcuno ha i dati pronti per questo?

In Java lo facevamo con la classe Observer/Observable - forse c'è qualcosa di simile, o meglio in iOS?

risposta

3

Un modo più semplice, anche se non necessariamente diverso, è quello di creare una classe singleton, ad es. AppData, a cui è possibile accedere in vari modi e che sarebbero disponibili per tutte le altre classi. Ha il vantaggio di separare la tua roba specifica per app dai contenuti delegati dell'app. Si potrebbe definire la classe in questo modo:

 
@interface AppData : NSObject 

// Perhaps you'll declare some class methods here... 

@end 

una cosa comune che faccio è definire metodi di classe su una tale classe di accedere, ad esempio, Impostazioni valori o le costanti specifiche app o altri oggetti Singleton. Ci sono molte possibilità.

Alla fine, si può fare molto con i metodi di classe, che chiamerebbero qualcosa come [AppData theMethod]. Ricorda che non è possibile accedere a self all'interno di un metodo di classe.

Facendo un ulteriore passo avanti, è possibile definire ivars per la classe AppData e quindi gestire un'istanza singleton di AppData. Utilizza un metodo di classe, ad es. +sharedInstance, per ottenere un handle per il singleton su cui è quindi possibile chiamare mehods. Ad esempio, [[AppData sharedInstance] someMethod:myArgument]. L'implementazione di +sharedInstance può essere il luogo in cui si gestisce la creazione effettiva del singleton, che viene infine restituito dal metodo.

Non sono sicuro di definire questo approccio come una "best practice", ma ho trovato questo modello piuttosto utile.

+0

Sì, ho dimenticato i singleton e li uso sempre a Java .. Lo proverò .. – geekyaleks