用戶體系緩存調(diào)整

APP一般都會保存用戶數(shù)據(jù)(除銀行類、政府某些及個別神奇的)
一個調(diào)整的過程

1.偏好設(shè)置

一開始很多同學(xué)都會喜歡使用偏好設(shè)置,存取通過Key,剛開始比較簡單的情況下。簡單的APP偷懶做法,不是很推薦,如需使用Key統(tǒng)一定義。
KV

2.YYCache

KV.
V直接對象

3.歸檔(接口穩(wěn)定下修改,后期接口變動調(diào)整新增,無法滿足后修改成數(shù)據(jù)庫),但當(dāng)時不記得什么原因,沒有使用YYCache而使用了歸檔。

然后歸檔這邊由于用戶單例類賦值的問題(新增字段無法加入,刪除文件再次寫入存在風(fēng)險,查看備注時這么寫,具體那時候忘了,總之是新增屬性,從接口取數(shù)據(jù)賦值存值有問題,有時候無法保存成功),然后修改成數(shù)據(jù)庫緩存,兼容處理

image.png

4.數(shù)據(jù)庫+偽單例

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

why偽單例?
數(shù)據(jù)庫使用WHC_ModelSqliteKit
數(shù)據(jù)庫模型映射,線程安全,模型層級,加密(注意不加密和加密不兼容,無法無縫過渡),問題是需要移除后再添加,不然會重復(fù)。

image.png

new方法創(chuàng)建一個或多個新實例,雖然這個實例一直沒有使用,也沒有賦值給給instance,instance也是正常的,項目也可以正常使用,迭代了十幾個版本,但是今天才注意到這個無限創(chuàng)建了實例。發(fā)現(xiàn)了必須要改一下。

5.數(shù)據(jù)庫+單例

image.png

存在問題

1.切換用戶單例需要銷毀
      解決線程dispatch_once線程的dispatch_once_t *predicate設(shè)置成0,就會再次執(zhí)行。線程設(shè)置成0,實例置空,登錄成功以后強制調(diào)用一次,防止get方法判斷時會生成一次。+ (void)signOut里調(diào)用cleanShare.
image.png
2.數(shù)據(jù)庫new方法沒法改(數(shù)據(jù)庫new方法以后重新賦值本地數(shù)據(jù)庫的數(shù)據(jù),單例重新讀取本地數(shù)據(jù),賦值無效)
        1.第三方庫不推薦改動,影響后來者使用
        2.pod管理,項目類無法引用
        3.調(diào)度也不行,總要讓他創(chuàng)建吧  
        那就創(chuàng)建吧,我把內(nèi)存實例都占了唄,單例寫法完整版,看上圖。
3.allocWithZone方法,
    蘋果說是歷史原因的方法,但是確實是因為他,占了個新內(nèi)存,新對象實例。然后重寫以后,內(nèi)存我占了,init以后,重新讀取,把原來賦值的屬性都清掉了,讀取了上次數(shù)據(jù)庫的數(shù)據(jù),so不同步,臨時字典保存,反轉(zhuǎn)。臨時解決一下。
    解決看下圖。通過臨時值保持,注意模型有數(shù)組,最好注釋數(shù)組類型(名詞忘了)。NSArray <YxModel*>* XXX; 解析映射。
image.png

由于開始支持門店和代理商登錄,后期可能支持品牌商,忽悠API映射字典的緩存,省去一些兼容麻煩(坑吧),每個版本的映射修改,不需要再做什么兼容,根據(jù)plist文件讀取。

續(xù):上面數(shù)據(jù)庫+單例的2.3問題思考一下會發(fā)現(xiàn)一個問題,數(shù)據(jù)庫是數(shù)據(jù)庫,單例是單例,為啥這么緊密?APP退出保存不行嗎?
所以最后只有在APP退出時保存,就沒有這些問題了。注意數(shù)據(jù)庫只是為了下次打開的讀取,單例是用戶數(shù)據(jù)在APP打開后的讀取,其實有時候不需要緩存那么多,就如,沒網(wǎng)你上什么APP?。。。開個玩笑,夸張了一點點。。。緩存還是要做的,能多做點就多做點。

image.png

5.數(shù)據(jù)庫部分遷移。原本是默認目錄,添加uid目錄

首先思考有二個方案,結(jié)合項目,發(fā)現(xiàn)原來表主鍵沒設(shè)置,設(shè)置新組件的話,會自動更新掉原來主鍵,可以設(shè)置成不更新,但是下個版本具體有沒有更新又不確定,在不影響用戶為前提的情況下,只是使用1方案,當(dāng)然可以在其他表外加添加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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,119評論 25 708
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,414評論 4 61
  • 在閱讀本書之前,我甚至不知道阿德勒是誰,可在我讀完推薦序和目錄之后,我便毫不猶豫的要分享力薦。倘若你在書中看到“如...
    君羊的小宇宙閱讀 1,572評論 5 11
  • 偉大的上帝 人們純凈了
    禾刀水白閱讀 215評論 0 0
  • priority 優(yōu)先級:0-1000 之間的整數(shù) 1000代表必須,0 不會生效 公式 First Item ...
    vvkeep閱讀 249評論 0 2

友情鏈接更多精彩內(nèi)容