用户体系缓存调整
APP一般都会保存用户数据(除银行类、政府某些及个别神奇的)
一个调整的过程
1.偏好设置
一开始很多同学都会喜欢使用偏好设置,存取通过Key,刚开始比较简单的情况下。简单的APP偷懒做法,不是很推荐,如需使用Key统一定义。
KV
2.YYCache
KV.
V直接对象
3.归档(接口稳定下修改,后期接口变动调整新增,无法满足后修改成数据库),但当时不记得什么原因,没有使用YYCache而使用了归档。
然后归档这边由于用户单例类赋值的问题(新增字段无法加入,删除文件再次写入存在风险,查看备注时这么写,具体那时候忘了,总之是新增属性,从接口取数据赋值存值有问题,有时候无法保存成功),然后修改成数据库缓存,兼容处理
image.png4.数据库+伪单例
+ (instancetype)shareInstance {
@synchronized(self) {
if (instance == nil) {
instance = [[UserProfile alloc] initWithSqlite];
pthread_mutex_init(&(instance->lock), NULL);
}
}
return instance;
}
why伪单例?
数据库使用WHC_ModelSqliteKit
数据库模型映射,线程安全,模型层级,加密(注意不加密和加密不兼容,无法无缝过渡),问题是需要移除后再添加,不然会重复。
new方法创建一个或多个新实例,虽然这个实例一直没有使用,也没有赋值给给instance,instance也是正常的,项目也可以正常使用,迭代了十几个版本,但是今天才注意到这个无限创建了实例。发现了必须要改一下。
5.数据库+单例
image.png存在问题
1.切换用户单例需要销毁
解决线程dispatch_once线程的dispatch_once_t *predicate设置成0,就会再次执行。线程设置成0,实例置空,登录成功以后强制调用一次,防止get方法判断时会生成一次。+ (void)signOut里调用cleanShare.
image.png
2.数据库new方法没法改(数据库new方法以后重新赋值本地数据库的数据,单例重新读取本地数据,赋值无效)
1.第三方库不推荐改动,影响后来者使用
2.pod管理,项目类无法引用
3.调度也不行,总要让他创建吧
那就创建吧,我把内存实例都占了呗,单例写法完整版,看上图。
3.allocWithZone方法,
苹果说是历史原因的方法,但是确实是因为他,占了个新内存,新对象实例。然后重写以后,内存我占了,init以后,重新读取,把原来赋值的属性都清掉了,读取了上次数据库的数据,so不同步,临时字典保存,反转。临时解决一下。
解决看下图。通过临时值保持,注意模型有数组,最好注释数组类型(名词忘了)。NSArray <YxModel*>* XXX; 解析映射。
image.png
由于开始支持门店和代理商登录,后期可能支持品牌商,忽悠API映射字典的缓存,省去一些兼容麻烦(坑吧),每个版本的映射修改,不需要再做什么兼容,根据plist文件读取。
续:上面数据库+单例的2.3问题思考一下会发现一个问题,数据库是数据库,单例是单例,为啥这么紧密?APP退出保存不行吗?
所以最后只有在APP退出时保存,就没有这些问题了。注意数据库只是为了下次打开的读取,单例是用户数据在APP打开后的读取,其实有时候不需要缓存那么多,就如,没网你上什么APP?。。。开个玩笑,夸张了一点点。。。缓存还是要做的,能多做点就多做点。
5.数据库部分迁移。原本是默认目录,添加uid目录
首先思考有二个方案,结合项目,发现原来表主键没设置,设置新组件的话,会自动更新掉原来主键,可以设置成不更新,但是下个版本具体有没有更新又不确定,在不影响用户为前提的情况下,只是使用1方案,当然可以在其他表外加添加uid字段(也没啥用)
1.用户表主键uid+uid目录
2.用户表+其他表一个uid字段
WHC_ModelSqliteKit库上添加了一个新方法(https://github.com/LDXu/WHC_ModelSqliteKit)
做了修改自动处理兼容
+ (NSDictionary *)whc_SqlitePathAutoHandle {
NSString *member_id = [UserProfile backMember_id];
NSString *value = [WHC_ModelSqlite defaultPath];
NSString *key = member_id.length?[NSString stringWithFormat:@"%@%@/", [WHC_ModelSqlite defaultPath], member_id]:value;
return @{key: value};
}
+ (NSString *)whc_OtherSqlitePath {
return [NSString stringWithFormat:@"%@UserProfile_v3.3.0.sqlite", [WHC_ModelSqlite defaultPath]];
}
外加一个3.4.0版本的兼容处理
image.png