使用NSUserDefaults持久化登录接口数据的填坑笔记
项目中一直是使用
NSUserDefaults
把登录接口获取到的用户信息, 保存在本地的plist
文件. 一切都是那么的Easy, 世界是多么的美好. 直到今天(2017-02-25), 切换服务器(我们APP支持自定义服务器)的时候再登录, 直接闪退, **what fuck !!!!!! **
寻找闪退原因
** ‘Attempt to insert non-property list object ** 这是控制台给的闪退原因
- 断点调试, 发现崩在了
[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:dic];
上, 然后就是对比之前和现在的接口数据有什么不一样. 发现接口多返回了一个字段sysUser
, 该字段是个字典类型, 里面存储了好多个键值对.
难道是NSUserDefaults
不支持字典嵌套字典的格式, 什么鬼????
-
Google 搜索, 基本上都是说
NSUserDefaults
不支持存储自定义的类型, 需要转为data
类型才能存储. 但是在这里我是直接把接口的数据存储的, 根本不存在自定义的类型啊? -
仔细看了一下接口数据, 发现接口数据有
"<null>"
, 我靠,NSUserDefaults
解析不了这种类型啊.
解决方案
既然知道了原因所在, 那就对症下药吧!!!
- 使用
MJExtension
把登录接口的数据转换为模型LoginModel
LoginModel *account = [LoginModel mj_objectWithKeyValues:result];
- 继续使用
MJExtension
把account
转为字典, 这样就过滤掉<null>
NSDictionary *dic = [account mj_keyValues];
- 最后再使用
NSUserDefaults
持久化数据[[NSUserDefaults standardUserDefaults] setValuesForKeysWithDictionary:dic];
写在最后
填完坑, 瞬间感觉, 天还很蓝, 世界还很美好😜