Open yiangdea opened 7 years ago
清晰明了,提个需求,求不挨打... mapping函数是在数据转换成model之前,修改制定规则 能否考虑提供一个高度自定义model组成的函数,在model组合的时候可以自主修改model值 因为很多情况下可能出现一个A model中的某个属性可能分别为B C D model(Any类型),这样mapping函数近乎于失效,使用上不方便,且不利于缓存 我目前都是字段上存储json数据,自己写另一个属性懒加载做转换操作.这样实现上比较丑.
场景上有部分相近的地方,但还是不能完全满足
我说的这个业务场景稍微复杂一些,即泛型的实际类型是由数据本身决定的. 比如支付宝首页的动态信息可能有多种类型, 假设分别为转账信息,快递信息,支付信息 这三种信息的json不一样,假设服务器返回一个list信息,混合存在这三种信息. 想要将这三种model同时放在一个list model中.. 就需要在生成的时候根据当前json的信息.判断什么时候是转账、快递和支付信息 然后再用https://github.com/alibaba/HandyJSON/wiki/%E6%94%AF%E6%8C%81%E6%B3%9B%E5%9E%8B 这样才能保证业务需求
最好的解决办法我认为,就是放出接口,让用户可以自行对某些字段进行完全的自定义操作 自己完成赋值,或者更加复杂的操作 OC model库例如 :YYModel和Mantle 都有类似的接口
用的比较习惯,提个不成熟的小建议
之前我没有OC开发的经验…能分享下YYModel
和Mantle
是通过什么接口实现的吗?我参考一下。
// JSON: { "name":"Harry", "timestamp" : 1445534567 }
// Model: @interface User @property NSString name; @property NSDate createdAt; @end
@implementation User // 当 JSON 转为 Model 完成后,该方法会被调用。 // 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。 // 你也可以在这里做一些自动转换不能完成的工作。
// 当 Model 转为 JSON 完成后,该方法会被调用。 // 你可以在这里对数据进行校验,如果校验不通过,可以返回 NO,则该 Model 会被忽略。 // 你也可以在这里做一些自动转换不能完成的工作。
上面是YYModel的官方例子,做法是在model转换完成之后,提供接口将json和model同时作为参数传入 待用户自定义操作完成之后再返回core函数
鉴于效率和易扩展考虑,个人拙见认为在model转换之前让用户自定义,也是可以的 库本身也可以在转换之前,将已经有操作的字段剔除 并且用户也可以在自定义时候修改json结构,效率上也更快
我没细致的研究过HandyJSON的源码,知道现行的结构能否实现
感觉比较接近了,但是在你这种场景,还是要改进一下。
这两个自定义转换,我之前都有看过. 我觉得核心点在于设计库的时候,偏向于所有的转换都由库来做操作 自定义的也是转换过程,但实际情况可能千奇百怪 换一个场景可能又不适用了
不如直接开一个接口引用代码块 极少数的情况下,直接引用使用者的代码块,做数据赋值转换 也可以保证库本身的兼容性
class Student: HandyJSON { var id: String? var name: String? var age: Int? var grade: Grade = .One var height: Int? var gender: Gender? var className: String? var teacher: Teacher = Teacher() var subjects: [Subject]? var seat: String?
// func mapping(mapper: HelpingMapper) { //// mapper <<< //// self.descriptionValue <-- "description" // // mapper.specify(property: &Ï, name: "description") // } }
class MissionDetailModel: Student { var attachments: [String]? var deadLine: String? var descriptionValue: String? var hunter: String? var walletId: String? var actionTypes: [String]?
}