美文网首页程序员iOS Developer
iOS - 模型数据持久化保存实现

iOS - 模型数据持久化保存实现

作者: 小蠢驴打代码 | 来源:发表于2018-03-15 15:27 被阅读936次
    image.png

    在iOS开发实际中,可以在 AppDelegate.mdidFinishLaunchingWithOptions方法中,快速定位需要当前需要开发的控制器

    但是,如果要开发的控制器,需要之前的控制器传值怎么办呢?

    image.png

    ==> 解决办法 :

    • 方法1:不设置rootVC = 当前开发控制器(TwoVC),默认使用homeVC,一步一步点击,似魔鬼的步伐一般进入TwoVC
    • 方法2 :还是设置rootVC = 当前的开发控制器(TwoVC),同时,使用数据持久化保存,保存OneVC传过来的数据,然后从硬盘中读取

    模型数据存储

    1. 直接存储到NSUserDefault中

    image.png

    结果 :Attempt to insert non-property list object <ProductModel: 0x600000232100> for key product

    原因 :NSUserDefaults支持的数据格式有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型,而我们这里存储的是自定义的model类型-ProductModel,该类型不被支持

    2. 使用归档先将model转为NSData,再存储

    思路:既然NSUserDefaults不支持自定义类型存储,但是支持NSData类型存储,就通过NSKeyedArchiver转成NSData类型,再存储~

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:_productModel];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"product"];
    
    image.png

    结果:- [ProductModel encodeWithCoder:]: unrecognized selector sent to instance

    原因:对于自定义的类必须要实现<NSCoding>协议中的encodeWithCoder和initWithCoder方法,才能归档和恢复这个类产生的对象

    总结:实现<NSCoding>协议也太**&&¥¥麻烦了点,对于懒癌晚期患者,不想搞这种操作;

    3. 先将模型转字典,就是基本数据类型了,再存

    思路:既然YYModel有字典转模型的方法,也有模型转字典的方法 -
    yy_modelToJSONObject

    image.png

    华丽分割线:MNCacheClass工具类(一行代码实现model数据的持久化存取~)

    工具方法使用方法:

    ///存储 - 数据持久化保存的key
    + (void)mn_saveModel:(id)model key:(NSString *)key;
    
    ///读取 - 获取数据持久化保存的Model  - 要传入model的Class - 内部进行yyModel转模型
    + (id) mn_getSaveModelWithkey:(NSString *)key modelClass:(Class)modelClass;
    

    内部实现原理:

    //传入model,进行模型转字典 ,字典通过NSKeyedArchiver转NSData ,再保存到NSUserDefaults中
    + (void)mn_saveModel:(id)model key:(NSString *)key{
        
        //model转json
        NSDictionary *productDic = [model yy_modelToJSONObject];
        
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:productDic];
        [[NSUserDefaults standardUserDefaults] setObject:data forKey:key];
        
    }
    
    //通过key获取NSUserDefaults保存的数据,在根据传入的modelClass - 进行YYModel的字典转模型,最终返回模型数据
    + (id) mn_getSaveModelWithkey:(NSString *)key modelClass:(Class)modelClass{
    
        NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:key];
        NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        return [modelClass yy_modelWithJSON:dict];
    }
    

    实际操作:

    //存储
    [MNCacheClass mn_saveModel:_studentModel key:@"studentModel"];
    
    //读取
    StudentModel *get = [MNCacheClass mn_getSaveModelWithkey:@"studentModel" modelClass:[StudentModel class]];
    
    image.png

    在实际开发中的使用流程

    1. 默认正常的rootVC = homeVC,走正常的 homeVC -> OneVC -> TwoVC流程
    2. 在要进行操作的控制器TwoVC中,添加判断
    TwoVC.m中
    
        if(_productModel){
            //如果_productModel有数据,说明是OneVC传过来的,此时进行存储操作
            [MNCacheClass mn_saveModel:_studentModel key:@"studentModel"];
        }else{
            //如果_productModel没有数据,说明当前的rootVC = 当前控制器(TwoVC),因为_productModel没数据,就必须从MNCacheClass中读取
            _productModel = [MNCacheClass mn_getSaveModelWithkey:@"studentModel" modelClass:[StudentModel class]];
            NSLog(@"get = %@",_productModel);
        }
    
    1. 修改AppDelegate.m代码,实现window.rootViewController = TwoVC;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
        [self setDefaultWindow];
    
        //设置当前的开发控制器TwoVC为rootVC
        self.window.rootViewController = [[TwoViewController alloc]init];
        
        return YES;
    }
    

    验证:

    image.png



    demo

    觉得有用的可以给个star,不胜感激~

    相关文章

      网友评论

        本文标题:iOS - 模型数据持久化保存实现

        本文链接:https://www.haomeiwen.com/subject/nelhqftx.html