image.png
在iOS开发实际中,可以在 AppDelegate.m
的 didFinishLaunchingWithOptions
方法中,快速定位需要当前需要开发的控制器
image.png
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,该类型不被支持
思路:既然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>协议也太**&&¥¥麻烦了点,对于懒癌晚期患者,不想搞这种操作;
思路:既然YYModel有字典转模型的方法,也有模型转字典的方法 -
yy_modelToJSONObject
image.png
工具方法使用方法:
///存储 - 数据持久化保存的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
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);
}
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