用户体系缓存调整

2017-10-20  本文已影响9人  LD_X

APP一般都会保存用户数据(除银行类、政府某些及个别神奇的)
一个调整的过程

1.偏好设置

一开始很多同学都会喜欢使用偏好设置,存取通过Key,刚开始比较简单的情况下。简单的APP偷懒做法,不是很推荐,如需使用Key统一定义。
KV

2.YYCache

KV.
V直接对象

3.归档(接口稳定下修改,后期接口变动调整新增,无法满足后修改成数据库),但当时不记得什么原因,没有使用YYCache而使用了归档。

然后归档这边由于用户单例类赋值的问题(新增字段无法加入,删除文件再次写入存在风险,查看备注时这么写,具体那时候忘了,总之是新增属性,从接口取数据赋值存值有问题,有时候无法保存成功),然后修改成数据库缓存,兼容处理

image.png

4.数据库+伪单例

 + (instancetype)shareInstance {
    @synchronized(self) {
         if (instance == nil) {
             instance = [[UserProfile alloc] initWithSqlite];
             pthread_mutex_init(&(instance->lock), NULL);
         }
    }
     return instance;
 }

why伪单例?
数据库使用WHC_ModelSqliteKit
数据库模型映射,线程安全,模型层级,加密(注意不加密和加密不兼容,无法无缝过渡),问题是需要移除后再添加,不然会重复。

image.png
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?。。。开个玩笑,夸张了一点点。。。缓存还是要做的,能多做点就多做点。

image.png

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
上一篇下一篇

猜你喜欢

热点阅读