如何读取plist文件
方法一:
1.获取当前程序主路径下的某个文件的路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"];
2.读取路径里面的内容,保存的数据是什么类型就用什么类型取
二进制NSData 数组 NSArray 字典NSDictionary
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
3.使用数据 把编码转化为文本
NSArray *statusArray = [dic objectForKey:@"status"];
4.获取status[]数组的第一个元素 数组元素都是字典 用字典对象接收
NSDictionary *firstDic = [statusArray objectAtIndex:0];
5.获取user对应的数据 user是一个字典
NSDictionary *userDic = [firstDic objectForKey:@"user"];
6.获取name address 均为字符串
NSString *name = [userDic objectForKey:@"name"];
NSString *address = [userDic objectForKey:@"address"];
方法二:数据封装
- 为什么封装数据?
数据太多了,保存数据都需要不不同的变量量来保存,变量与变量之前没有任何的关联, 不好管理。
- 数据封装:
把数据封装为某一个具体的模型,比如微博的模型WeiboModel,里面有name,text,address,source等属性。
- 数据封装的好处:
a.不用定义多个变量来保存同种类型的数据;
b.将多个没有关联的数据封装为一个整体;
c.便于访问数据,用点语法直接访问即可,如:WeiboModel.name。
- 步骤:
1.获取数据(本地 / plist / 数据库 / 服务器)
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"];
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSArray *statusArray = [dic objectForKey:@"status"];
2.定义一个数据模型,如微博模型:WeiboModel,这个数据模型有如下特点:
a.继承于NSObject
b.数据模型⾥面只有这个模型的基本数据,没有任何与UI相关的操作
c.注意在定义数据模型的时候, 尽量让模型的属性变量名和数据源⾥面的key相对应
在头文件中添加属性变量:
@propertynonatomic, copy) NSString *text;
@propertynonatomic, copy) NSString *name;
@propertynonatomic, copy) NSString *address;
3.解析数据
a.在获取数据的地方对数据进⾏封装
self.modelsArray = [NSMutableArray array];
for NSDictionary *itemDic in statusArray) { WeiBoModel *model = [[WeiBoModel alloc] init]; //获取user对应的字典NSDictionary *userDic = [itemDic objectForKey:@"user"]; //将数据赋给这个模型对象model.text = [itemDic objectForKey:@"text"];model.name = [userDic objectForKey:@"name"];model.address = [userDic objectForKey:@"address"]; //保存模型对象[_modelsArray addObject:model];
}
b.在数据模型里面对数据进行封装 写一个类方法
+ WeiBoModel *)modelWithDataDic:NSDictionary *)dic{//创建模型对象WeiBoModel *model = [[WeiBoModel alloc] init];NSDictionary *userDic = [dic objectForKey:@"user"];model.text = [dic objectForKey:@"text"];model.name = [userDic objectForKey:@"name"];model.address = [userDic objectForKey:@"address"];return model;
}
for NSDictionary *itemDic in statusArray) {WeiBoModel *mo = [WeiBoModel modelWithDataDic:itemDic];[_modelsArray addObject:mo];}
4.操作数据 ,获取第二个模型的地址
WeiBoModel *model = [_modelsArray objectAtIndex:1];
NSLog@"%@", model.address);
方法三:使用开源工具
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"shop" ofType:@"plist"];
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSArray *statusArray = [dic objectForKey:@"status"];
self.modelsArray = [WeiBoModel mj_objectArrayWithKeyValuesArray:statusArray];
WeiBoModel *model = [_modelsArray objectAtIndex:0];
NSLog@"%@", model.text);
self.modelsArray = [WeiBoModel mj_objectWithFilename:@"shop.plist"];
NSLog@"%@", _modelsArray);