YYModel
YYModel copied to clipboard
复合 YYModel
您好,我遇到了一个问题,希望能够听听您的看法:
从服务器获取到的 json dict 模型,我们称之为 server json 吧,它大概长这样:
{
"name": "应用创造学",
"other": "other values",
"ext": {
"desc": "应用创造学是一门研究创造的学问"
}
}
然而我希望它在数据库中,是这个样子:
{
"name": "应用创造学",
"other": "other values",
"desc": "应用创造学是一门研究创造的学问"
}
也就是说,我需要两种不同的 json to model 逻辑。我能想到的两个方案,要么我再写一套一模一样的代码,换个前缀;要么我有两套属性一样的 Model,追加一个同名属性映射的通用逻辑。
@heistings 遇到跟你同样的问题,有好的解决方案吗?
@bluesky0109
- json to model 阶段,支持多值映射,参考:
+ (NSDictionary *)modelCustomPropertyMapper {
return @{@"name" : @"n",
@"page" : @"p",
@"desc" : @"ext.desc",
@"bookID" : @[@"id",@"ID",@"book_id"]};
}
- modle to json 阶段,不支持多值映射。YYModel 使用 NSDictionary 这样的纯模型担任 Mapper 的职能,难以暴露接口让外界指定场景进行不同的转换。
如果要改进,需要将 Mapper 封装成 Class,提供默认的 Mapper 实现,业务方可以指定自己的 Mapper。调用 toDictionary 方法时,提供参数,Mapper 根据参数不同,采用不同的转换策略。
- 如果你在 model to json 阶段遇到多值映射问题,并且已经决定使用 YYModel,你可以单独写一个 toDBDictionary 方法,父类默认调用 YYModel 的 toDictionary 方法,子类重载,做一些额外处理。
如果场景不多,一种场景写一套;如果场景比较多,那么你可以封装 toDictionaryWithUserInfo:(NSDictionary *)userInfo;内部根据透传的参数决定使用哪种转换策略。
无论如何, 使用 YYModel 在 model to json 阶段有多值映射问题,都需要进行额外的处理,也就是对默认转化的字典进行“加工”
@heistings 非常感谢 `{ "name": "应用创造学", "other": "other values", "ext": { "desc": "应用创造学是一门研究创造的学问", "date": "2011-03-03" } }
{ "name": "应用创造学", "other": "other values", "desc": "应用创造学是一门研究创造的学问", "date": "2011-03-03" }
@interface Ext : NSObject @property NSString *desc; @property NSString *date; @end
@interface Book : NSObject @property NSString *name; @property NSString *other; @property Ext *ext; @end
` 这种情况 基于YYModel 能提供一个 简单的方式处理吗?
@heistings 反复查看源码提供的接口 找到了解决方案:modelCustomWillTransformFromDictionary
@bluesky0109 你仔细看一下之前的回答,给出了如何使用 modelCustomWillTransformFromDictionary 的 Sample。
但是 model to json 阶段,只能映射成一种。