Gibt es eine " reverse "setValuesForKeysWithDictionary" - ein makeDictionaryWithObjectProperties?
Ich parse einige JSON von einem Webservice, das gibt mir ein NSDictionary, ich benutze dieses Wörterbuch zu besiedelten Eigenschaften auf einen valueEntity vom Typ NSObject von
[myObject setValuesForKeysWithDictionary:JSONDict];
(myObject hat die gleiche Eigenschaftennamen und Typen wie das Wörterbuch, aus dem JSON-parser)
name = name
count = count
startDate = startDate
etc..
Gibt es eine Möglichkeit in die andere Richtung gehen, wo ich ein NSDictionary, die ich haben möchte, "gefüllt" mit dem Eigenschaften und deren Werte aus einem meiner NSObject Unterklasse.
Wie schlage ich vor, im Titel, etwas entlang der Linien von:
eine Möglichkeit
MyObject *myObject = [[MyObject alloc] init];
[myObject setValuesForKeysWithDictionary:JSONDict];
die andere Weise herum
NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];
Der Grund dafür ist, dass ich eine valueEntity, die durch das Protokoll, meine Ansichten Stimmen, aber ich möchte füllen Sie ein NSManagedObject mit den Werten auch. Also dachte ich, dass mit dem NSDictionary als Zwischenschritt, die ich bekommen kann um zu tun eine Kategorie auf meinem NSManagedObject, die legt jede Eigenschaft, die manuell aus der Wert auf mein Objekt Unterklassen von NSObject.
Mit einem Wörterbuch, das ich gehen kann:
[myManagedObject setValuesForKeysWithDictionary:dict];
Ich bekomme einfach nicht das Wörterbuch Darstellung zurück, sobald ich fertig mit den obigen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, die Methode ist:
Sie übergeben in einem array von Schlüssel Vertreter der Objekt-Eigenschaften, die Sie interessiert, und wieder ein Wörterbuch mit den property-Werten.
Den
NSKeyValueCoding
- Protokoll definiert eine Reihe von leistungsfähigen und äußerst nützliche Methoden; es ist eine tolle Sache kennen zu lernen.http://developer.apple.com/library/ios/#documentation/cocoa/reference/foundation/Protocols/NSKeyValueCoding_Protocol/Reference/Reference.html
Es gibt auch ein sehr wertvoller Begleiter guide:
http://developer.apple.com/library/ios/documentation/cocoa/Conceptual/KeyValueCoding/KeyValueCoding.html#//apple_ref/doc/uid/10000107i
Tun Sie wirklich wollen, um all die Eigenschaften? Oft ist es nicht sinnvoll, um alle Eigenschaften eines Objekts als ein Wörterbuch. Zum Beispiel, wenn ein
NSManagedObject
enthält eine Beziehung, die Sie wollen, um es zu bekommen in das Wörterbuch? Wenn ja, wie wollen Sie das vertreten?Als jlehr sagte, es besser zu ernähren, eine Reihe von Schlüsseln explizit mit
dictionaryWithValuesForKeys:
.Sagte, mit dem gefürchteten Objective-C runtime können Sie in der Tat umzusetzen
makeDictionaryWithObjectProperties
. Verwenden class_getPropertyList und property_getName. Ich werde nicht detailliert, wie das zu tun, weil wenn Sie diesem Ansatz Folgen, werden Sie wissen, was Sie tun.Durch die Art und Weise, es ist sehr gefährlich, für Sie zum zuweisen eines
JSON
zurückgegebene Objekt aus dem Internet auf eineNSManagedObject
mitsetValuesForKeysWithDictionary:
. Weil, wenn dieJSON
Objekt geschieht, enthalten eine zusätzliche Taste, die Sie nicht erwarten, dass Ihr code kann plötzlich Abstürzen. So, nicht, dass.Anderen Kommentar: Ihr pseudo-code
macht nicht viel Sinn: ja, Sie können anrufen
setValuesForKeysWithDictionary:
gegenNSObject
, aber er wird kläglich scheitern, weil Sie nichtsetValue:forKey:
für alle Einträge inJSONDict
zu einer VanilleNSObject
. Ich denke, Sie wissen, dass, aber ich möchte sagen, dass explizit so, dass ein Neuling, der kommt auf dieser Seite nicht täuschen lassen.Dieser Kerl hier einige runtime-Magie, um alle deklarierten Eigenschaften auf ein Objekt und habe das Wörterbuch, ohne manuell die Bereitstellung der Eigenschaft Namen.
Und es ' E auch diese schön github repo ich fand, dass Sie ziemlich viel tun, den gleichen trick, aber in einem schönen Paket. Sie haben auch die Möglichkeit zum erstellen einer json-oder plist aus einem Objekt.