懶載入又叫延遲載入,他有兩個好處,第一:當使用時才載入,而不是一開始就載入,為CPU節省時間做其他的事情,第二:記載之前會判斷數據是否為空,如果空是空的才去載入,避免了重覆載入數據,系統可能會清理記憶體使數組為空,這樣確保數組不為空 有時plist文件不是一層可能兩層甚至多層,記住先建小模型,究竟如....
懶載入又叫延遲載入,他有兩個好處,第一:當使用時才載入,而不是一開始就載入,為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;
}