Получить свойства NSManagedObject как NSDictionary

Если у меня есть NSManagedObject, который я извлек из контекста, как я могу создать NSDictionary из его динамических свойств, не просто скопировав каждое поле в словарь явно?

Если мой управляемый объект выглядит так, например:

@implementation Track

@dynamic artist;
@dynamic group;
@dynamic purchase_url;
@dynamic title;
@dynamic file_name;
@dynamic year;

@end

После извлечения из базы данных в этом случае мне нужен NSDictionary с теми же свойствами, которые установлены для каждого из этих @dynamic-свойств.

Ответы

Ответ 1

Существует более быстрый способ преобразования NSManagedObject в NSDictionary (от ответ Маттиаса Бауха на fooobar.com/questions/285005/...):

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];

Ответ 2

Вы можете достичь своего подхода, следуя методу:

unsigned int count;
objc_property_t *properties = class_copyPropertyList([CoreDataObject class], &count);
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:16];

for(int i = 0; i < count; i++) {
    objc_property_t property = properties[i];
    NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding];
    id obj = [coreDataObjectInstance valueForKey:name];
    if (obj) {
        // Skip properties with nil values (optionally you can use: [dictionary setObject:((obj == nil) ? [NSNull null] : obj) forKey:name]; without any if-statement) 
        [dictionary setObject:obj forKey:name];
    }
}

free(properties);

"CoreDataObject" - это основной объект данных, который вы хотели бы преобразовать в NSDictionary, в то время как "coreDataObjectInstance" является экземпляром этого основного объекта данных. Имейте в виду, что вы должны:

#include <objc/runtime.h>

Кроме того, было бы здорово, если бы вы могли дать нам больше информации о том, что вы хотели бы достичь с помощью этой идеи, возможно, существует другое/лучшее решение.

Надеюсь, это поможет!

Ответ 3

Я думаю, это то, что вы на самом деле ищете:

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC];

тогда у вас есть доступ к этим словарям:

[trackEntity propertiesByName];
[trackEntity relationshipsByName];
[trackEntity attributesByName];

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