2010-09-14 5 views
14

mi parse un po 'di JSON da un servizio web, questo mi dà un NSDictionary, io uso questo dizionario per immobili popolate su un valueEntity di tipo NSObject daEsiste un reverse "setValuesForKeysWithDictionary" - un makeDictionaryWithObjectProperties?

[myObject setValuesForKeysWithDictionary:JSONDict]; 

(myObject ha gli stessi nomi di proprietà e tipi di come il dizionario dal parser JSON)

name = name 
count = count 
startDate = startDate 
etc.. 

c'è un modo per andare nella direzione opposta, dove ho un NSDictionary che vorrei avere "pieno" con le proprietà ed i loro valori da una sottoclasse mia NSObject. Come Suggerisco nel titolo, qualcosa sulla falsariga di questo:

un modo

MyObject *myObject = [[MyObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

viceversa

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties]; 

La ragione di questo è che io avere un valoreEntity che, per protocollo, le mie viste sono tutte conformi, ma vorrei popolare anche un NSManagedObject con i valori. Quindi ho pensato che usando NSDictionary come step intermedio potessi andare in giro a dover fare una categoria sul mio NSManagedObject che imposta ogni proprietà manualmente dal valore sul mio oggetto sottoclasse NSObject.

Con un dizionario posso andare:

[myManagedObject setValuesForKeysWithDictionary:dict]; 

non riesco proprio a trovare la rappresentazione dizionario di nuovo fuori una volta che ho fatto quanto sopra?

risposta

17

Sì, il metodo è:

- (NSDictionary *)dictionaryWithValuesForKeys:(NSArray *)keys 

Si passa in un array di chiavi che rappresentano le proprietà degli oggetti che vi interessano, e tornare un dizionario contenente i valori delle proprietà.

Il protocollo NSKeyValueCoding definisce un numero di metodi potenti e molto utili; è una cosa grandiosa con cui familiarizzare.

http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html

C'è anche una preziosa guida correlata:

http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i

+0

Ciao jlehr, grazie :) Vedo che non è automatico come [obj setValuesforKeysWithDictionary: dict], ma poi di nuovo, come sottolinea Yuji, questo rende possibile scegliere le proprietà ed evitare le relazioni, ecc. Questo è davvero grandioso perché ora posso mantenere un singolo array di nomi di proprietà condivisi tra gli oggetti e questa è una soluzione molto più flessibile. Grazie ancora, andrà bene sulle guide. – RickiG

+0

Hey Ricki, nessun problema :-) – jlehr

+0

Grazie per aver risposto .. Stavo cercando lo stesso ... :) – Mrunal

5

Vuoi veramente ottenere tutte le proprietà? Spesso non ha senso ottenere tutte le proprietà di un oggetto come un dizionario. Ad esempio, se un NSManagedObject contiene una relazione, vuoi farlo anche nel dizionario? Se sì, come vuoi rappresentarlo?

Come ha detto jlehr, è meglio inserire un set di chiavi in ​​modo esplicito utilizzando dictionaryWithValuesForKeys:.

Detto questo, utilizzando il temuto runtime Objective-C, è possibile implementare lo makeDictionaryWithObjectProperties. Utilizzare class_getPropertyList e property_getName. Non descriverò in dettaglio come farlo, perché se segui questo approccio, sai cosa stai facendo.

Tra l'altro, è molto pericoloso per voi di assegnare un oggetto JSON tornato da Internet a un NSManagedObject utilizzando setValuesForKeysWithDictionary:. Perché se l'oggetto JSON contiene una chiave aggiuntiva che non ti aspetti, il tuo codice potrebbe improvvisamente bloccarsi. Quindi, non farlo.

Un altro commento: il tuo pseudo-codice

NSObject *myObject = [[NSObject alloc] init]; 
[myObject setValuesForKeysWithDictionary:JSONDict]; 

non ha molto senso: sì, si può chiamare setValuesForKeysWithDictionary: contro NSObject, ma sarà miseramente fallire, non perché si può setValue:forKey: per una delle voci in JSONDict in una vaniglia NSObject. Immagino che tu lo sappia, ma mi piacerebbe dirlo esplicitamente in modo che un novizio che si imbatte in questa pagina non sia ingannato.

+0

Ciao Yuji e grazie anche a te. Non dovrei seguire la via di runtime ancora :) Farò solo l'esempio NSObject in qualcosa di più sensato, sono davvero contento che entrambi ti siano imbattuti in quello che stavo cercando di ottenere nonostante il fatto che mi mancassero le parole per descriverlo precisamente. In realtà analizzo, perfeziono e convalidare i miei valori JSON prima che vadano "sull'oggetto", ma grazie ancora, sto ottenendo alcuni ottimi suggerimenti dalle vostre risposte. – RickiG

+0

Prego :) – Yuji

1

This guy here usato un po 'di magia di runtime per ottenere tutte le proprietà dichiarate su un oggetto e ottenuto il dizionario senza fornire manualmente i nomi delle proprietà.

E c'è anche questo nice github repo che ho trovato, fanno praticamente lo stesso trucco, ma in un bel pacchetto. Hanno anche la possibilità di creare un json o plist da un oggetto.

+0

[AutoMagicCoding] (https://github.com/psineur/NSObject-AutomagicCoding) è stato davvero utile per me, proprio quello che stavo cercando :) – Alex75