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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏移动端周边技术扩展

iOS移动端用户统计开发文档

17950
来自专栏一“技”之长

iOS中通知中心(NSNotificationCenter)的使用总结

@property (readonly, copy) NSString *name;

6730
来自专栏Objective-C

iOS-打印 JSON 数据原格式

39070
来自专栏向治洪

activity的启动模式和栈管理

 在学习Android的过程中,Intent是我们最常用Android用于进程内或进程间通信的机制,其底层的通信是以Binder机制实现的,在物理层则是通过共享...

21690
来自专栏FreeBuf

scapy在wlan中的应用

Scapy 又是scapy,这是python的一个网络编程方面的库,它在wlan中也有很强大的应用。一般我们买块网卡,然后aircrack-ng套件爆破一下邻居...

369100
来自专栏一“技”之长

iOS:JSON转OC属性小工具 原

      在iOS开发中,只要有网络模块,就需要数据模型的编写。在进行数据模型的解析和映射时,JSONModel是一个非常常用且优秀的第三方框架,之前有有过博...

11720
来自专栏iOS开发攻城狮的集散地

iOS CoreData (一) 增删改查

26680
来自专栏hotqin888的专栏

engineercms利用pdf.js制作连续看图功能

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

19310
来自专栏青玉伏案

iOS开发之集成iOS9中的Core Spotlight Framework搜索App的内容

Spotlight在iOS9上做了一些新的改进, 也就是开放了一些新的API, 通过Core Spotlight Framework你可以在你的app中集成S...

24160
来自专栏冰霜之地

ReactiveCocoa 中 RACCommand 底层实现分析

在ReactiveCocoa 过程中,除去RACSignal和RACSubject这些信号类以外,有些时候我们可能还需要封装一些固定的操作集合。这些操作集合都是...

18020

扫码关注云+社区

领取腾讯云代金券