在我寻求更新 iOS 项目中的核心数据模型时,我在服务器上查询 JSON 对象,这些对象在某种程度上与我的模型的托管实体相对应。我追求的最终结果是从 JSON 输出获得可靠的更新解决方案。
对于这个问题中的示例,我将命名核心数据管理对象existingObj
以及传入的 JSON 反序列化字典updateDict
。棘手的部分是处理这些事实:
- 并非所有属性
existingObj
存在于updateDict
- 并非所有属性
updateDict
可以在extistingObj
.
- 并非所有类型
existingObj
的属性与 JSON 反序列化属性匹配。 (某些字符串可能需要自定义 Objective-C 包装器)。
-
updateDict
可能包含未初始化的键的值(nil
) in 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:
setter(间接通过 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
.
子问题 B:如果只有属性的名称,如何测试属性的类型?
我想就是这样。我想这一定是这里已经存在的东西的骗局,但我找不到它。也许你们可以吗?
干杯,EP。
附:如果您有更好的方法将自定义 Objective-C 对象同步到反序列化 JSON 对象,请分享!最后,结果才是最重要的。