YYModel icon indicating copy to clipboard operation
YYModel copied to clipboard

复合 YYModel

Open heistings opened this issue 7 years ago • 5 comments

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

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

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

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

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

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

heistings avatar Jan 24 '18 13:01 heistings

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

bluesky0109 avatar Feb 28 '18 04:02 bluesky0109

@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 avatar Feb 28 '18 05:02 heistings

@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 能提供一个 简单的方式处理吗?

bluesky0109 avatar Feb 28 '18 06:02 bluesky0109

@heistings 反复查看源码提供的接口 找到了解决方案:modelCustomWillTransformFromDictionary

bluesky0109 avatar Mar 01 '18 06:03 bluesky0109

@bluesky0109 你仔细看一下之前的回答,给出了如何使用 modelCustomWillTransformFromDictionary 的 Sample。

但是 model to json 阶段,只能映射成一种。

heistings avatar Mar 01 '18 06:03 heistings