zoukankan      html  css  js  c++  java
  • 懒加载的思想以及实现

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

     

    }

    MDM相关内容
  • 相关阅读:
    笨办法29IF语句
    笨办法28布尔表达式
    笨办法27记住逻辑
    笨办法26恭喜你,可以进行一次考试了
    笨办法25更多更多的练习
    笨办法23复制文件
    成功转移(✿◡‿◡)
    笨办法22到目前为止你学到了什么?
    vue.js
    webpack-优化
  • 原文地址:https://www.cnblogs.com/liyy2015/p/5128896.html
Copyright © 2011-2022 走看看