В своем стремлении обновить модель 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", то есть @ " Но как мне проверить тип получающего свойства в existingObj
, чтобы я знал, когда преобразовывать значения, а когда просто присваивать? Я надеялся на что-то вроде typeOfSelector:
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else {
// perform custom assignment
}
Конечно, это фиктивный код. Я не могу полагаться на тестирование типа значения existingObj
-свойства, поскольку оно может быть унифицированным или nil
.
Подвопрос B: Как проверять тип значения свойство, если у вас есть только название свойства?
Думаю, это все. Я подумал, что это, должно быть, обман того, что уже здесь, но я не смог его найти. Может, у вас получится?
Но как мне проверить тип получающего свойства в existingObj
, чтобы я знал, когда преобразовывать значения, а когда просто присваивать? Я надеялся на что-то вроде typeOfSelector:
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else {
// perform custom assignment
}
Конечно, это фиктивный код. Я не могу полагаться на тестирование типа значения existingObj
-свойства, поскольку оно может быть унифицированным или nil
.
Подвопрос B: Как проверять тип значения свойство, если у вас есть только название свойства?
Думаю, это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
поскольку оно может быть унифицировано или nil
.
Подвопрос B: Как проверять тип свойства, если у вас есть только имя свойства?
Я думаю, что это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
поскольку оно может быть унифицировано или nil
.
Подвопрос B: Как проверять тип свойства, если у вас есть только имя свойства?
Я думаю, что это все. Я подумал, что это должно быть обман того, что уже здесь, но я не смог этого найти. Может, у вас получится?
Ура, EP.
PS Если у вас есть лучший способ синхронизировать пользовательские объекты Objective-C с десериализованными объектами JSON, поделитесь, пожалуйста! В конце концов, главное - результат.