iOS 封装BaseModel
来源:互联网 发布:tomcat运行php文件 编辑:程序博客网 时间:2024/05/22 07:03
大家都知道,当我们想要把请求回来的数据转化成model属性,首先是通过这样赋值的:
for (NSDictionary *dic in jsonDic[@"subjects"]) { // jsonDic[@"subjects"] 请求回来的数据:/*date: 9月4日 - 9月6日subjects: [ - { - box: 9350000new: falserank: 1subject { - rating: { + }genres: [ + ]collect_count: 14casts: [ + ]title: 战争房间original_title: War Roomsubtype: moviedirectors: [ + ]year: 2015images: { + }alt: http://movie.douban.com/subject/26591731/id: 26591731}}*/ NSDictionary *dic2 = dic[@"subject"];/* 遍历拿到:subject { - rating: { + }genres: [ + ]collect_count: 14casts: [ + ]title: 战争房间original_title: War Roomsubtype: moviedirectors: [ + ]year: 2015images: { + }alt: http://movie.douban.com/subject/26591731/id: 26591731}*/ FilmModel *model = [[FilmModel alloc] init]; model.title = dic2[@"title"]; // 这里的赋值都是set方法,所以我只要把这句话封装一下就好了。 model.year = dic2[@"year"]; model.collect_count = dic2[@"collect_count"]; [_data addObject:model]; }
这样在每个类要请求数据的时候每次都要写这么多烦不烦啊!
实现:从第三个开始看重点看。
//
// BaseModel.m
// 时空影院
//
// Created by teather on 15-9-14.
// Copyright (c) 2015年 黄江桂. All rights reserved.
//
#import "BaseModel.h"@implementation BaseModel// 1. 找到JSONKey跟属性的对应关系(属性名和JSONKey相同)- (NSMutableDictionary *)buildRelationship:(NSDictionary *)json { // 因为属性和字典的值都是一模一样的,所以在这里只要把他们的value 和model.attribute都对应上就可以了 NSMutableDictionary *relationDic = [NSMutableDictionary dictionary]; // key和属性名的映射关系字典 for (NSString *key in [json allKeys]) { // 取出JSON字典里的所有Key if ([key isEqualToString:@"id"]) { // 处理id特殊情况 // [NSStringFromClass([self class]) 从字符串中生成一个类名 [relationDic setObject:[NSStringFromClass([self class]) stringByAppendingString:@"ID"] forKey:@"id"]; // 属性名:类名+ID } else { // 给对应的key赋值 [relationDic setObject:key forKey:key]; // 多数情况下,属性名(object)和JSON数据中的Key(key)名字相同 } } // 结束之后就能达到每个value都跟key是一样的。 return relationDic;}// 2. 获取子类的属性名字,找到setter方法- (SEL)findSetterMethod:(NSString *)propertyName { // 从字符串生成一个方法(SEL类型)生成set属性的方法,例如:setPropertyName:(NSString *)propertyName; NSSelectorFromString// 根据字符串生成一个方法 return NSSelectorFromString([NSString stringWithFormat:@"set%@:",[[[propertyName substringToIndex:1] uppercaseString] stringByAppendingString:[propertyName substringFromIndex:1]]]);}- (void)setValuesForAttributeKeysWithDictionary:(NSDictionary *)keyedValues { // keyedValues相当于JSON请求回来的字典(数据) // 1. 获取映射的字典 NSDictionary *relationDic = [self buildRelationship:keyedValues]; // 等于第一个方法里面的字典 // 2. 找到set方法,给属性赋值相当于现实:model.year = dic2[@"year"]; for (NSString *key in [relationDic allKeys]) { SEL setter = [self findSetterMethod:relationDic[key]]; // 根据属性名找到setter方法 if ([self respondsToSelector:setter]) { // 判断方法是否存在 [self performSelector:setter withObject:keyedValues[key]]; // 给setter方法赋值 } }}@end
完成了,下次需要赋值的时候直接掉用:
for (NSDictionary *dic in jsonDic[@"subjects"]) { NSDictionary *dic2 = dic[@"subject"]; FilmModel *model = [[FilmModel alloc] init]; [model setValuesForAttributeKeysWithDictionary:dic2]; // 封装的BaseModel方法给model属性赋值 [_data addObject:model]; }
0 0
- iOS 封装BaseModel
- ios baseModel的封装方法
- mvc 封装 5 BaseModel
- iOS基类Model--BaseModel
- BaseModel
- BaseModel
- BaseModel
- baseModel
- BaseModel
- BaseModel
- 封装之路(四) BaseFragment BaseViewModel BaseModel
- iOS开发BaseModel的创建和使用(基类)
- iOS开发技巧系列---打造强大的BaseModel
- iOS开发技巧系列---打造强大的BaseModel
- BaseModel(数据模型映射关系)
- (九)BaseModel的简单使用
- 基于ActiveAndroid框架的BaseModel
- iOS- 封装单例宏
- 坐标
- PHP中magic_quotes_gpc和 magic_quotes_runtime区别及其反斜线转义问题
- MySql 代码收集
- 理解strong与weak)强引用与弱引用转载自《http://blog.sina.com.cn/s/blog_7c8dc2d50101lc08.html》
- jQiery事件
- iOS 封装BaseModel
- app混淆
- Ubuntu下使用模拟器Bochs运行《Linux内核完全剖析——基于0.12内核》第3章P31 引导扇区源码boot.s的一系列步骤
- linux原子操作
- Java时间:GMT以及UTC
- PHP基于代码模板的编程思想
- rmmod卸载驱动模块时提示:No such file or directory
- 正向代理与反向代理的区别【Nginx读书笔记】
- 分析.pin文件时,用到的几个自定义函数