ibireme/YYModel

复合 YYModel

Opened this issue · 5 comments

您好,我遇到了一个问题,希望能够听听您的看法:

从服务器获取到的 json dict 模型,我们称之为 server json 吧,它大概长这样:

{
    "name": "应用创造学",
    "other": "other values",
    "ext": {
        "desc": "应用创造学是一门研究创造的学问"
    }
}

然而我希望它在数据库中,是这个样子:

{
    "name": "应用创造学",
    "other": "other values",
    "desc": "应用创造学是一门研究创造的学问"
}

也就是说,我需要两种不同的 json to model 逻辑。我能想到的两个方案,要么我再写一套一模一样的代码,换个前缀;要么我有两套属性一样的 Model,追加一个同名属性映射的通用逻辑。

@heistings 遇到跟你同样的问题,有好的解决方案吗?

@bluesky0109

  1. json to model 阶段,支持多值映射,参考:
+ (NSDictionary *)modelCustomPropertyMapper {
    return @{@"name" : @"n",
             @"page" : @"p",
             @"desc" : @"ext.desc",
             @"bookID" : @[@"id",@"ID",@"book_id"]};
}
  1. modle to json 阶段,不支持多值映射。YYModel 使用 NSDictionary 这样的纯模型担任 Mapper 的职能,难以暴露接口让外界指定场景进行不同的转换。

如果要改进,需要将 Mapper 封装成 Class,提供默认的 Mapper 实现,业务方可以指定自己的 Mapper。调用 toDictionary 方法时,提供参数,Mapper 根据参数不同,采用不同的转换策略。

  1. 如果你在 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 阶段,只能映射成一种。