2010-09-14 12 views
14

I analizować niektóre JSON z usługi internetowej, to daje mi NSDictionary, używam tego słownika do właściwości zaludnionych na valueEntity typu NSObject przezCzy istnieje odwrotna "setValuesForKeysWithDictionary" - a makeDictionaryWithObjectProperties?

[myObject setValuesForKeysWithDictionary:JSONDict]; 

(myObject ma takie same nazwy właściwości i typy jak słownika z parsera JSON)

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

Czy istnieje sposób, aby przejść na drugą stronę, gdzie mam NSDictionary, które chciałbym mieć „wypełnione” z właściwościami i ich wartościami z podklasy mój NSObject. Tak jak sugeruje w tytule, coś na wzór tego:

jeden sposób

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

na odwrót

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties]; 

Powodem tego jest to, że mieć valueEntity, które według protokołu, wszystkie moje widoki są zgodne, ale chciałbym wypełnić obiekt NSManagedObject również wartościami. Więc pomyślałem, że używając NSDictionary jako pośredniego kroku mogę obejść konieczność zrobienia kategorii na moim NSManagedObject, który ustawia każdą właściwość ręcznie od wartości na moim obiekcie podporządkowanym NSObject.

ze słownikiem mogę Go:

[myManagedObject setValuesForKeysWithDictionary:dict]; 

Po prostu nie mogę uzyskać słownika reprezentację z powrotem raz zrobiłem wyżej?

Odpowiedz

17

Tak, metoda jest:

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

przekazać w tablicy kluczy reprezentujących właściwości obiektów, które Cię interesują, i wrócić słownik zawierający wartości właściwości.

Protokół NSKeyValueCoding definiuje wiele silnych i wysoce użytecznych metod; dobrze się z tym zapoznać.

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

Jest też bardzo cenny przewodnik towarzysz:

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

+0

Cześć, dziękuję :) Widzę, że nie jest tak automatyczny jak [obj setValuesforKeysWithDictionary: dict], ale potem znowu, jak zaznacza Yuji, pozwala to wybrać i wybrać właściwości i uniknąć relacji itp. To jest naprawdę świetne, ponieważ mogę teraz utrzymywać pojedynczą tablicę nazw właściwości, które są współużytkowane przez obiekty i jest to o wiele bardziej elastyczne rozwiązanie. Jeszcze raz dziękuję, trafią prosto na przewodników. – RickiG

+0

Hej, Ricki, nie ma problemu :-) – jlehr

+0

Dzięki za odpowiedź .. Szukałem tego samego ... :) – Mrunal

5

Czy naprawdę chcesz, aby uzyskać wszystkie właściwości? Często nie ma sensu, aby uzyskać wszystkie właściwości obiektu jako słownik. Na przykład, jeśli NSManagedObject zawiera relację, czy chcesz ją również pobrać ze słownika? Jeśli tak, jak chcesz go reprezentować?

Jak już powiedziałeś, lepiej jest podawać zestaw kluczy jawnie, używając dictionaryWithValuesForKeys:.

To powiedziawszy, używając przerażającego Objective-C runtime, można rzeczywiście wdrożyć makeDictionaryWithObjectProperties. Użyj class_getPropertyList i property_getName. Nie będę szczegółowo tego robić, ponieważ jeśli zastosujesz to podejście, wiesz, co robisz.

Nawiasem mówiąc, bardzo niebezpieczne jest przypisanie obiektu JSON zwróconego z Internetu do NSManagedObject przy użyciu setValuesForKeysWithDictionary:. Ponieważ, jeśli obiekt JSON zawiera dodatkowy klucz, którego się nie spodziewasz, Twój kod może nagle ulec awarii. Tak więc, nie rób tego.

Kolejny komentarz: twój pseudo-kod

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

nie mają większego sensu: tak można nazwać setValuesForKeysWithDictionary: przed NSObject, ale to nie zdało egzaminu, a nie, ponieważ można setValue:forKey: dla każdego z wpisami w JSONDict do wanilii NSObject. Sądzę, że o tym wiesz, ale chciałbym to wyraźnie powiedzieć, aby nowicjusz, który natknął się na tę stronę, nie został oszukany.

+0

Cześć Yuji i dziękuję też. Nie powinienem jeszcze iść na ścieżkę runtime :) Po prostu sprawię, że przykład NSObject stanie się bardziej sensowny, naprawdę cieszę się, że oboje przyłapaliście się na tym, co próbowałem osiągnąć pomimo faktu, że brakowało mi słów, żeby to opisać dokładnie. Właściwie parsuję, udoskonalam i potwierdzam moje wartości JSON, zanim przejdą do "obiektu", ale dzięki jeszcze raz otrzymuję świetne wskazówki od twoich odpowiedzi. – RickiG

+0

Nie ma za co :) – Yuji

1

This guy here użył magii runtime, aby uzyskać wszystkie właściwości zadeklarowane na obiekcie i uzyskał słownik bez ręcznego podawania nazw właściwości.

I znalazłem także ten nice github repo, które wykonują tę samą sztuczkę, ale w ładnym opakowaniu. Mają także możliwość tworzenia jsonów lub plistów z obiektu.

+0

[AutoMagicCoding] (https://github.com/psineur/NSObject-AutomagicCoding) był dla mnie bardzo przydatny, właśnie tego szukałem :) – Alex75

Powiązane problemy