懒加载的思想以及实现
懒加载又叫延迟加载,他有两个好处,第一:当使用时才加载,而不是一开始就加载,为CPU节省时间做其他的事情,第二:加载之前会判断数据是否为空,如果空是空的才去加载,避免了重复加载数据,系统可能会清理内存使数组为空,这样确保数组不为空
有时plist文件不是一层可能两层甚至多层,记住先建小模型,究竟如何实现懒加载,下面以一个实际的例子为大家演示如何实现懒加载,看的是实现的思想,而不是代码。
// CZCar.h
#import <Foundation/Foundation.h>
@interface CZCar : NSObject
/**
* 图片的名字
*/
@property (nonatomic,copy) NSString *icon;
/**
* 代表汽车的品牌
*/
@property (nonatomic,copy) NSString *name;
/**
* 实例化的对象方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
- (instancetype)initWithDict:(NSDictionary *)dict;
/**
* 实例化的类方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
+ (instancetype)carWithDict:(NSDictionary *)dict;
/**
* 类方法,根据传入的plist文件名,返回一个存放模型对象的数组
*
* @param fileName 传入一个plist文件的文件名
*
* @return 存放模型对象的数组
*/
+ (NSArray *)carWithPlistName:(NSString *)fileName;
@end
// CZCar.m
#import "CZCar.h"
@implementation CZCar
/**
* 实例化的对象方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
- (instancetype)initWithDict:(NSDictionary *)dict{
//1. 初始化
self = [super init];
//2. 如果self存在,就加载数据
if (self) {
[self setValuesForKeysWithDictionary:dict];
}
//3. 返回对象
return self;
}
/**
* 实例化的类方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
+ (instancetype)carWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
/**
* 类方法,根据传入的plist文件名,返回一个存放模型对象的数组
*
* @param fileName 传入一个plist文件的文件名
*
* @return 存放模型对象的数组
*/
+ (NSArray *)carWithPlistName:(NSString *)fileName{
//1.加载数据
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:fileName ofType:@"plist"]];
//2.字典转模型
// 2.1 创建临时的可变数组用来存放模型对象
NSMutableArray *nmArray = [NSMutableArray array];
//2.2 遍历字典数组
for (NSDictionary *dict in array) {
//2.3 字典转模型,同时添加到可变数组中
[nmArray addObject:[self carWithDict:dict]];
}
//2.4 返回存放为模型对象的可变数组
return nmArray;
}
@end
// CZCarGroup.h
#import <Foundation/Foundation.h>
@interface CZCarGroup : NSObject
/**
* 汽车的数组
*/
@property (nonatomic,strong) NSArray *cars;
/**
* 索引标题
*/
@property (nonatomic,copy) NSString *title;
/**
* 实例化的对象方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
- (instancetype)initWithDict:(NSDictionary *)dict;
/**
* 实例化的类方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
+ (instancetype)carGroupWithDict:(NSDictionary *)dict;
/**
* 类方法,根据传入的plist文件名,返回一个存放模型对象的数组
*
* @param fileName 传入一个plist文件的文件名
*
* @return 存放模型对象的数组
*/
+ (NSArray *)carGroupWithPlistName:(NSString *)fileName;
@end
//"CZCarGroup.m"
#import "CZCarGroup.h"
#import "CZCar.h"
@implementation CZCarGroup
- (void)setCars:(NSArray *)cars{
// _cars = cars;
//_cars 存放的就是字典数据
// 字典转模型
//1. 创建一个可变的数组
NSMutableArray *nmArray = [NSMutableArray array];
//2. 遍历字典数组
for (NSDictionary *dict in cars) {
//3. 字典转模型
CZCar *car = [CZCar carWithDict:dict];
//4. 将模型的对象添加到可变数组中
[nmArray addObject:car];
}
//5. 将存放模型的数组赋值给字典数组
_cars = nmArray;
// NSLog(@"给cars设置数据");
}
/**
* 实例化的对象方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
- (instancetype)initWithDict:(NSDictionary *)dict{
//1. 初始化
self = [super init];
//2. 如果self存在,就加载数据
if (self) {
//这里通过KVC完成的字典转模型
[self setValuesForKeysWithDictionary:dict];
// [self setValue:dict[@"title"] forKeyPath:@"title"];
// [self setValue:dict[@"cars"] forKeyPath:@"cars"];
//
// self.cars = dict[@"cars"];
//
// [self setCars:dict[@"cars"]];
}
//3. 返回对象
return self;
}
/**
* 实例化的类方法
*
* @param dict 传入一个字典数据
*
* @return 返回当前实例化对象
*/
+ (instancetype)carGroupWithDict:(NSDictionary *)dict{
return [[self alloc]initWithDict:dict];
}
/**
* 类方法,根据传入的plist文件名,返回一个存放模型对象的数组
*
* @param fileName 传入一个plist文件的文件名
*
* @return 存放模型对象的数组
*/
+ (NSArray *)carGroupWithPlistName:(NSString *)fileName{
//1.加载数据
NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle]pathForResource:fileName ofType:@"plist"]];
//2.字典转模型
// 2.1 创建临时的可变数组用来存放模型对象
NSMutableArray *nmArray = [NSMutableArray array];
//2.2 遍历字典数组
for (NSDictionary *dict in array) {
//2.3 字典转模型,同时添加到可变数组中
[nmArray addObject:[self carGroupWithDict:dict]];
}
//2.4 返回存放为模型对象的可变数组
return nmArray;
}
@end
//
// ViewController.m
#import "ViewController.h"
#import "CZCarGroup.h"
#import "CZCar.h"
@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>
@property (nonatomic,strong) NSArray *carGroupArray;
@end
@implementation ViewController
//重写carGroupArray的get方法实现懒加载- (NSArray *)carGroupArray{
//判断数据是否为Nil
if(_carGroupArray == nil){
//加载数据
_carGroupArray = [CZCarGroup carGroupWithPlistName:@"cars_total"];
}
return _carGroupArray;
}