在我的 iOS 项目中更新 Core Data 模型的过程中,我在服务器上查询 JSON 对象,这些对象在某种程度上与我的模型的托管实体相对应。我努力的最终结果是来自 JSON 输出的可靠更新解决方案。
对于这个问题中的示例,我将命名核心数据托管对象existingObj
和传入的 JSON 反序列化字典updateDict
。棘手的部分是处理这些事实:
- 并非所有属性
existingObj
都存在于updateDict
- 并非 的所有属性
updateDict
都在extistingObj
. - 并非所有类型的
existingObj
's 属性都与 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
作为 getter 的事实,而我即将调用setDisplayName:
setter(间接通过 KVC)。我宁愿是 [existingObj hasWritablePropertyWithName :key] 之类的东西,但是我找不到这样做的东西。
这就产生了子问题 A:如果您只有属性的名称,如何测试属性设置器?
下一部分是我想根据它们的类型自动识别属性的地方。如果updateDict
和existingObj
都有一个用于键 @"displayName" 的 NSString,那么设置新值很容易。但是,如果updateDict
包含键 @"color" 的 NSString,即 @"niceShadeOfGreen",我想将其转换为正确的 UIColor 实例。但是如何测试接收属性的类型,existingObj
以便知道何时转换值以及何时简单地分配?我希望有一些类似于typeOfSelector 的东西:
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else {
// perform custom assignment
}
当然这是伪代码。我不能依赖测试existingObj
-property 值的类型,因为它可能是未初始化的或nil
.
子问题 B:如果您只有属性的名称,如何测试属性的类型?
我想就是这样。我想这一定是这里已经存在的东西的欺骗,但我找不到它。也许你们可以?
干杯,EP。
PS 如果您有更好的方法将自定义的 Objective-C 对象同步到反序列化的 JSON 对象,请分享!最后,结果才是最重要的。