美文网首页
用户体系缓存调整

用户体系缓存调整

作者: LD_X | 来源:发表于2017-10-20 00:34 被阅读9次

    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

    相关文章

      网友评论

          本文标题:用户体系缓存调整

          本文链接:https://www.haomeiwen.com/subject/jkxmuxtx.html