19

コンテキストから取得した NSManagedObject がある場合、各フィールドを辞書に明示的にコピーするだけでなく、動的プロパティから NSDictionary を作成するにはどうすればよいですか?

たとえば、管理対象オブジェクトが次のようになっているとします。

@implementation Track

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

@end

この場合、データベースからフェッチした後、これらの @dynamic プロパティのそれぞれに同じプロパティが設定された NSDictionary が必要です。

4

4 に答える 4

56

NSManagedObject を NSDictionary に変換するより高速な方法があります ( https://stackoverflow.com/a/5664745/2294824でのMatthias Bauch の応答から) :

NSArray *keys = [[[myObject entity] attributesByName] allKeys];
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys];
于 2013-11-18T02:47:41.527 に答える
11

次の方法でアプローチを実現できます。

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>

さらに、このアイデアで何を達成したいのか、さらに洞察を提供していただければ幸いです。別の/より良い解決策があるかもしれません.

お役に立てれば!

于 2012-04-26T21:46:37.730 に答える