2013-09-08 2 views
3

Я работаю над приложением cline-server. Я получаю объекты JSON в качестве ответа с сервера, , тогда я перехожу JSON в NSDictionary. Теперь мне нужно привязать NSDictionary к пользовательскому объекту данных. Таким образом, я создал класс BasicDataObject, который имеет:Сопоставление NSDictionary с подклассом NSObject

#pragma mark - Inits 

- (id)initWithDictionary:(NSDictionary *)dictionary { 
    self = [super init]; 

    if (self) { 
     [self setValuesForKeysWithDictionary:dictionary]; 
    } 

    return self; 
} 

#pragma mark - Service 

- (id)valueForUndefinedKey:(NSString *)key { 
    NSArray *allKeys = [self allKeys]; 
    id returnObject = nil; 
    BOOL keyFound = NO; 

    for (NSString *propertyName in allKeys) { 
     if ([propertyName isEqualToString:key]) { 
      id object = [self performSelector:NSSelectorFromString(key)]; 

      returnObject = object ? object : [NSNull null]; 
      keyFound = YES; 
      break; 
     } 
    } 

    if (!keyFound) { 
     @throw [NSException exceptionWithName:NSUndefinedKeyException reason:[NSString stringWithFormat:@"key '%@' not found", key] userInfo:nil]; 
    } 

    return returnObject; 
} 

- (void)setValue:(id)value forUndefinedKey:(NSString *)key { 
    NSString *capitalizedString = [key stringByReplacingCharactersInRange:NSMakeRange(0,1) 
                   withString:[[key substringToIndex:1] capitalizedString]]; 
    NSString *setterString = [NSString stringWithFormat:@"set%@:", capitalizedString]; 

    [self performSelector:NSSelectorFromString(setterString) withObject:value]; 
} 

- (void)setNilValueForKey:(NSString *)key { 
    object_setInstanceVariable(self, key.UTF8String, 0); 
} 

- (NSArray *)allKeys { 
    unsigned int propertyCount = 0; 
    objc_property_t *properties = class_copyPropertyList(self.class, &propertyCount); 
    NSMutableArray *propertyNames = [NSMutableArray array]; 

    for (unsigned int i = 0; i < propertyCount; ++i) { 
     objc_property_t property = properties[i]; 
     const char *name = property_getName(property); 

     [propertyNames addObject:[NSString stringWithUTF8String:name]]; 
    } 

    free(properties); 

    return propertyNames; 
} 

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

- (id)initWithDictionary:(NSDictionary *)dictionary 

Правомерно/хороший подход, или мне нужно сделать, чтобы добавить что-то еще?

ответ

1

Это OK способ сделать это. Ive обнаружил, что редко json-ключи являются наиболее подходящими именами для свойств моего объекта, поэтому код большинства людей, который я видел вручную, устанавливает каждое свойство на свой объект, чтобы они могли: 1) называть его тем, что им нужно; 2) конвертировать в примитивные значения из словарь json, который всегда будет содержать объекты. (Например, NSNumber -> float)

 Смежные вопросы

  • Нет связанных вопросов^_^