Есть ли обратный "setValuesForKeysWithDictionary" - makeDictionaryWithObjectProperties? - PullRequest
14 голосов
/ 14 сентября 2010

Я анализирую некоторые JSON из веб-службы, это дает мне NSDictionary, я использую этот словарь для заполнения свойств по значению valueEntity типа NSObject

[myObject setValuesForKeysWithDictionary:JSONDict];

(myObject имеет те же имена и типы свойствкак словарь из анализатора JSON)

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

Есть ли способ пойти другим путем, где у меня есть NSDictionary, который я хотел бы "заполнить" свойствами и их значения из myNSObject подкласс.Как я предлагаю в заголовке, что-то вроде этого:

в одну сторону

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

в другую сторону

NSMutableDictionary *dict = [myObject makeDictionaryWithObjectProperties];

Причина этого заключается в том, что у меня есть valueEntity, которому по протоколу соответствуют все мои представления, но я бы также хотел заполнить NSManagedObject значениями.Поэтому я подумал, что используя NSDictionary в качестве промежуточного шага, я могу обойтись без необходимости создавать категорию для моего NSManagedObject, которая устанавливает каждое свойство вручную из значения моего подкласса объекта NSObject.

[myManagedObject setValuesForKeysWithDictionary:dict];

Я просто не могу вернуть словарное представление, как только я сделал выше?

Ответы [ 3 ]

17 голосов
/ 14 сентября 2010

Да, метод такой:

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

Вы передаете массив ключей, представляющих интересующие вас свойства объекта, и получаете словарь, содержащий значения свойств.

Протокол NSKeyValueCoding определяет ряд мощных и очень полезных методов;это отличная вещь, чтобы познакомиться с ней.

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

Также есть очень полезное руководство:

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

5 голосов
/ 14 сентября 2010

Вы действительно хотите получить все свойства?Часто не имеет смысла получать все свойства объекта в виде словаря.Например, если NSManagedObject содержит отношение, хотите ли вы также получить его в словаре?Если да, то как вы хотите это представить?

Как сказал jlehr, лучше явно задавать набор ключей, используя dictionaryWithValuesForKeys:.

Тем не менее, используя страшную среду выполнения Objective-C, вы действительно можете реализовать makeDictionaryWithObjectProperties.Используйте class_getPropertyList и property_getName .Я не буду подробно описывать, как это сделать, потому что если вы будете следовать этому подходу, вы будете знать, что делаете.

Кстати, вам очень опасно назначать объект JSON, возвращаемый изИнтернет на NSManagedObject с использованием setValuesForKeysWithDictionary:.Потому что, если объект JSON содержит дополнительный ключ, который вы не ожидаете, ваш код может внезапно завершиться сбоем.Итак, не делайте этого .

Еще один комментарий: ваш псевдокод

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

не имеет особого смысла: да, вы можете позвонить setValuesForKeysWithDictionary:против NSObject, но он с треском провалится, потому что вы не можете setValue:forKey: ни для одной из записей в JSONDict ванили NSObject.Полагаю, вы это знаете, но я бы хотел сказать это явно, чтобы новичка, который наткнулся на эту страницу, не обманули.

1 голос
/ 20 декабря 2011

Этот парень здесь использовал магию во время выполнения, чтобы получить все свойства, объявленные для объекта, и получил словарь, не предоставляя имен свойств вручную.

И вот это Хорошее репозиторий Github Я обнаружил, что они в значительной степени делают то же самое, но в хорошей упаковке.У них также есть возможность создавать json или plist из объекта.

...