В моем стремлении обновить модель Core Data в моем проекте iOS я запрашиваю сервер для объектов JSON, которые в некоторой степени соответствуют управляемым объектам моей модели.Конечный результат, к которому я стремлюсь, - это надежное решение для обновления выходных данных JSON.
В качестве примеров в этом вопросе я назову управляемый объект основных данных existingObj
и входящий десериализованный словарь JSON updateDict
.Сложная часть имеет дело с этими фактами:
- Не все свойства
existingObj
присутствуют в updateDict
- Не все свойства
updateDict
доступны вextistingObj
. - Не все типы свойств
existingObj
соответствуют десериализованным свойствам JSON.(для некоторых строк может потребоваться пользовательская оболочка Objective-C). updateDict
может содержать значения для неинициализированных ключей (nil
) в existingObj
.
Thisозначает, что при переборе обновленных словарей необходимо провести некоторое тестирование свойств туда-сюда.Сначала я должен проверить, существуют ли свойства 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).Я предпочел бы что-то вроде [существующий_объект hasWritablePropertyWithName : ключ], но что-то, что делает это, я не могу найти.
Это относится к подзапросу 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
.
Подвопрос B: Как проверить один тип свойства, если у вас есть только имя свойства?
Полагаю, все.Я подумал, что это, должно быть, дурак чего-то, что уже здесь, но я не смог его найти.Может быть, вы, ребята, можете?
Cheers, EP.
PS Если у вас есть лучший способ синхронизации пользовательских объектов Objective C с десериализованными объектами JSON, пожалуйста, поделитесь!В конце концов, результат имеет значение.