В моем стремлении обновить модель Core Data в моем проекте iOS я запрашиваю у сервера объекты JSON, которые в некоторой степени соответствуют управляемым объектам моей модели. Конечным результатом, к которому я стремлюсь, является надежное решение для обновления из вывода JSON.
Для примеров в этом вопросе я назову управляемый объект основных данных existingObj
и входящий десериализованный словарь JSON updateDict
. Сложная часть связана с этими фактами:
- Не все свойства
existingObj
присутствуют вupdateDict
- Не все свойства
updateDict
доступны вextistingObj
. - Не все типы свойств
existingObj
соответствуют десериализованным свойствам JSON. (для некоторых строк может потребоваться специальная оболочка Objective-C). updateDict
может содержать значения для ключей, которые не инициализированы (nil
) вexistingObj
.
Это означает, что при повторении обновленных словарей должно быть некоторое тестирование свойств туда и обратно. Сначала я должен проверить, существуют ли свойства updateDict
в existingObj
, затем я устанавливаю значение с помощью KVC, например так:
// key is an NSString, e.g. @"displayName"
if ([existingObj respondsToSelector:NSSelectorFromString(key)) {
[existingObj setValue:[updateDict objectForKey:key] forKey:key];
}
Хотя эта часть работает, мне не нравится тот факт, что я на самом деле тестирую displayName
в качестве геттера, в то время как я собираюсь вызвать сеттер setDisplayName:
(косвенно через KVC). Я бы предпочел что-то вроде [existingObj hasWritablePropertyWithName:key], но что-то, что делает это, я не могу найти.
Это приводит к подвопросу A: как можно проверить установщик свойств, если у вас есть только имя свойства?
В следующей части я хотел бы автоматизировать идентификацию свойств на основе их типов. Если и updateDict
, и existingObj
имеют NSString для ключа @"displayName", установка нового значения проста. Однако, если updateDict
содержит NSString для ключа @"color", который является @"niceShadeOfGreen", я хотел бы преобразовать его в правильный экземпляр UIColor. Но как мне проверить тип принимающего свойства в existingObj
, чтобы я знал, когда преобразовывать значения, а когда просто присваивать? Я надеялся на что-то вроде typeOfSelector:
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else {
// perform custom assignment
}
Конечно, это фиктивный код. Я не могу полагаться на проверку типа значения existingObj
-свойства, так как оно может быть унифицированным или nil
.
Подвопрос Б. Как проверить тип свойства, если у вас есть только название свойства?
Думаю, это все. Я подумал, что это, должно быть, дубликат чего-то, что уже было здесь, но я не смог его найти. Может быть, вы, ребята, можете?
Ура, EP.
P.S. Если у вас есть лучший способ синхронизации пользовательских объектов Objective-C с десериализованными объектами JSON, пожалуйста, поделитесь! В конце концов, важен результат.
updateDict
ключи, которые вы знаете, и проигнорировать все остальные. - person Costique   schedule 10.02.2011