当程序中有需要用到plist文件去存储一些东西的时候,我们在程序中也需要动态地去获取到plist文件中的内容并且使用它们。在MVC设计模式中,M指的是modal,代表着程序需要的数据,所以我们需要创建一个modal类然后处理plist文件中的数据或者是其他的来源,本文主要讲处理plist文件,而这个过程也就是本文要讨论的字典转模型
字典转模型可以说是有一个固定的模板,使用它很简单,但是我们应该从原理和思路上面去理解它,本文讲述的是处理中最基本的plist文件结构(还会有很多复杂的结构,不过都是建立在这个文件结构之上)首先是一个大的Array,接着Array中包含了很多的Dictionary,在Dictionary中包含了很多的NSString对象。同时,本文的项目是Single-View模板创建的。
首先先创建一个数据类(这里以不同的国家为例子),命名为Country
1、首先我们从Country.m去分析:
#import "Student.h"
@implementation Student
- (instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [super init]) {
// 不适用KVC的情况
self.name = dic[@"name"];
self.age = dic[@"school"];
// 使用KVC的情况
[self setValue:dic[@"name"] forKey:self.name];
[self setValue:dic[@"school"] forKey:self.school];
// 使用KVC的封装好的字典操作方法
[self setValuesForKeysWithDictionary:dic];
}
return self;
}
+ (instancetype)statusWithDic:(NSDictionary *)dic
{
return [[self alloc]initWithDic:dic];
}
// 在数据类中封装好一个类方法,用于在其他类中(MVC中即为在Controller中)调用此方法来获得模型化的数据对象
+ (NSArray *)students
{
NSMutableArray *mutableArray = [NSMutableArray array];
// 从plist文件中拿到数据
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"statuses.plist" ofType:nil]];
for (NSDictionary *dic in array) {
// 取出的dic必须通过模型化再传入到mutableArray中
[mutableArray addObject:[self statusWithDic:dic]];
}
return mutableArray;
}
@end
2、接着是通过看.h文件看看该怎么提供接口,使得其他类更为方便地操作数据类
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) NSString *school;
- (instancetype)initWithDic :(NSDictionary *)dic;
+ (instancetype)studentsWithDic :(NSDictionary *)dic;
+ (NSArray *)students;
@end
这里面暴露了三个方法,其中前两个方法都是关于初始化的方法,第三个方法是封装好的获得模型化的数据对象的方法接口
最后
3、最后我们看看怎么去使用这个具有模型化的数据类,本文就在viewController类中进行使用说明
3、最后我们看看怎么去使用这个具有模型化的数据类,本文就在viewController类中进行使用说明
#import "ViewController.h"
#import "Student.h"
@interface ViewController ()
@property (copy , nonatomic) NSArray *students;
@end
@implementation ViewController
// 模型对象的懒加载
- (NSArray *)students
{
if (_students == nil) {
// 在这里就调用了模型对象暴露出的接口,直接将模型化后的数据对象赋值给了属性
_students = [Student students];
}
return _students;
}
4、以上操作做完了之后,我们就直接使用点语法,即为self.students来获得模型化后的数据对象,然后通过self.student.name和self.student.age来获得数据对象的属性值