你的位置:首页 > 操作系统

[操作系统]懒加载了思想以及实现


  懒加载又叫延迟加载,他有两个好处,第一:当使用时才加载,而不是一开始就加载,为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;

 

}