В моем стремлении обновить модель Core Data в моем проекте iOS я запрашиваю сервер для объектов JSON, которые в некоторой степени соответствуют управляемым объектам моей модели. Конечным результатом, к которому я стремлюсь, является надежное решение для обновления с выхода JSON.Как проверить свойство и тип объекта на основе ключа NSString?
Для примеров в этом вопросе я назову основной объект управления данными 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
}
Конечно, это boguscode. Я не могу полагаться на тестирование типа значения existingObj
, поскольку он может быть унифицирован или nil
.
Подтверждение В: Как проверить тип имущества, если у вас есть только имя свойства?
Я думаю, что все. Я подумал, что это должно быть обманом того, что уже здесь, но я не мог найти его. Может, вы, ребята, можете?
Cheers, EP.
P.S. Если у вас будет лучший способ синхронизации пользовательских объектов Objective-C с десериализованными объектами JSON, пожалуйста, разделите их! В конце концов, результат имеет значение.
Я предлагаю вам просто запросить 'updateDict' для ключей * вы знаете * и игнорировать все остальное. – Costique
В приведенном выше примере это действительно жизнеспособный вариант. Однако в сценарии реального мира это сделало бы изменения в управляемом объекте и обновления очень сложными. Объекты состоят из более чем 30 ключей/свойств, большинство из которых - NSString или NSNumber. Если решение вопроса выше, синхронизация не нуждается в модификации, когда примитивные типы добавляются или изменяются с обеих сторон. – epologee