BaseModel的简单使用
Model主要作用便是为不同的数据创建对象,然后用于处理。我这里使用上只用到两个方面
1. 将服务器返回的数据转换成对象model,方便开发时的使用和保存。
2. 将一些和数据相关的操作在model中进行处理。
1. 数据转为model对象
这个实现上比较简单,原理就是键值对映射处理。已经写好了一个BaseModel,使用时只需要继承这个BaseModel即可。
@interface BaseModel : NSObject
//@property (nonatomic,copy)NSString *ret;//结果代码 1成功 0接口验证失败 -1渠道编码不存在
//@property (nonatomic,copy)NSString *tip;//结果描述
-(id)initWithDataDic:(NSDictionary*)data;//将字典转换为model
- (void)setAttributes:(NSDictionary*)dataDic;//键值对映射
- (NSDictionary*)attributeMapDictionary;
- (NSString *)customDescription;
- (NSString *)description;
- (NSData*)getArchivedData;
- (NSString *)cleanString:(NSString *)str; //清除\n和\r的字符串
- (NSDictionary *)convertToDictionary;//转换为字典
@end
实现操作流程如下
#import "MessageViewController.h"
#import "MessageModel.h"
@interface MessageViewController ()
@end
@implementation MessageViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = @"消息";
//将jsonString转换为字典,此时一般是我们请求到服务器返回的json字符串后做的第一件事
//要求服务器返回的数据类型全为string类型,ios的类型转换对int,boolean较弱
NSString *jsonString = @"{\"name\":\"JSON中国\",\"url\":\"http://www.json.org.cn\",\"page\":\"88\",\"isNonProfit\":\"true\",\"address\":{\"street\":\"浙大路38号.\",\"city\":\"浙江杭州\",\"country\":\"中国\"},\"links\":[{\"name\":\"Google\",\"url\":\"http://www.google.com\"},{\"name\":\"Baidu\",\"url\":\"http://www.baidu.com\"},{\"name\":\"SoSo\",\"url\":\"http://www.SoSo.com\"}]}";
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *err;
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:jsonData
options:NSJSONReadingMutableContainers
error:&err];
NSLog(@"%@",dic);
// 从打印出来的结果看,可以知道最外层有6个键值对,其中address和links较为特殊
// address可看做一个单独的对象,里面包含有三个键值对
// links是一个数组,每个数组里面可以看做是一个单独的对象,每个对象中包含两个键值对
// 根据我提到到每个单独数据模块都可以视为一个对象的话,因此我们此数据类型可以划分成三个数据model
// 1.最外层包含了全部数据的MessageModel
// 2.addressModel
// 3.linksModel
// {
// address = {
// city = "\U6d59\U6c5f\U676d\U5dde";
// country = "\U4e2d\U56fd";
// street = "\U6d59\U5927\U8def38\U53f7.";
// };
// isNonProfit = true;
// links = (
// {
// name = Google;
// url = "http://www.google.com";
// },
// {
// name = Baidu;
// url = "http://www.baidu.com";
// },
// {
// name = SoSo;
// url = "http://www.SoSo.com";
// }
// );
// name = "JSON\U4e2d\U56fd";
// page = 88;
// url = "http://www.json.org.cn";
// }
//建立三个model对象,并且对应每个对象的内容都创建属性
//将字典转为model数据以及调用方法如下
MessageModel *model = [[MessageModel alloc]initWithDataDic:dic];
NSLog(@"%@",model.name);
NSLog(@"%@",model.address.city);
NSLog(@"%@",((MessageLinkModel *)model.links[0]).name);
}
生成的文件结构
对于像AddressModel这样简单的对象,里面包含的只是单一键值对的,我们无需在.m文件中有操作
2. 数据的动态变更与处理
我们接着完善User这个我们前面提到的model。这个model除了将服务器返回的数据转换为model让我们使用外,还使用本地化技术将其保存到了本地。
这里另外需要提到的是一个开发小技巧
对于本地化存储的数据,如果需要更改其中某个数据的值,我们可以通过重写set赋值方法来实现,只要调用了某个属性的set方法我们就将值修改后重新保存到本地。
//修改属性值
- (void)setUname:(NSString *)uname
{
_uname = uname;
[self writeToFile];
}
对于一些依据数据进行不同操作的简单逻辑我们也可以在这里面进行操作。比如如果这个user中还有性别和签名两个属性。性别男女对应不同的签名时,我们可以在获得性别后在user中设定签名的值。