APP一般都會保存用戶數(shù)據(jù)(除銀行類啊送、政府某些及個別神奇的)
一個調(diào)整的過程
1.偏好設置
一開始很多同學都會喜歡使用偏好設置隅茎,存取通過Key,剛開始比較簡單的情況下。簡單的APP偷懶做法择诈,不是很推薦械蹋,如需使用Key統(tǒng)一定義。
KV
2.YYCache
KV.
V直接對象
3.歸檔(接口穩(wěn)定下修改羞芍,后期接口變動調(diào)整新增哗戈,無法滿足后修改成數(shù)據(jù)庫),但當時不記得什么原因荷科,沒有使用YYCache而使用了歸檔跪妥。
然后歸檔這邊由于用戶單例類賦值的問題(新增字段無法加入讶凉,刪除文件再次寫入存在風險狸棍,查看備注時這么寫酣胀,具體那時候忘了,總之是新增屬性全度,從接口取數(shù)據(jù)賦值存值有問題,有時候無法保存成功)斥滤,然后修改成數(shù)據(jù)庫緩存将鸵,兼容處理
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ù)庫模型映射佑颇,線程安全顶掉,模型層級,加密(注意不加密和加密不兼容挑胸,無法無縫過渡)痒筒,問題是需要移除后再添加,不然會重復茬贵。
new方法創(chuàng)建一個或多個新實例,雖然這個實例一直沒有使用簿透,也沒有賦值給給instance,instance也是正常的解藻,項目也可以正常使用老充,迭代了十幾個版本,但是今天才注意到這個無限創(chuàng)建了實例螟左。發(fā)現(xiàn)了必須要改一下啡浊。
5.數(shù)據(jù)庫+單例
存在問題
1.切換用戶單例需要銷毀
解決線程dispatch_once線程的dispatch_once_t *predicate設置成0,就會再次執(zhí)行胶背。線程設置成0巷嚣,實例置空,登錄成功以后強制調(diào)用一次钳吟,防止get方法判斷時會生成一次廷粒。+ (void)signOut里調(diào)用cleanShare.
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不同步腺劣,臨時字典保存绿贞,反轉。臨時解決一下橘原。
解決看下圖籍铁。通過臨時值保持,注意模型有數(shù)組趾断,最好注釋數(shù)組類型(名詞忘了)拒名。NSArray <YxModel*>* XXX; 解析映射。
由于開始支持門店和代理商登錄芋酌,后期可能支持品牌商靡狞,忽悠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?浸船。妄迁。。開個玩笑李命,夸張了一點點登淘。。封字。緩存還是要做的黔州,能多做點就多做點。
5.數(shù)據(jù)庫部分遷移阔籽。原本是默認目錄流妻,添加uid目錄
首先思考有二個方案,結合項目仿耽,發(fā)現(xiàn)原來表主鍵沒設置合冀,設置新組件的話各薇,會自動更新掉原來主鍵项贺,可以設置成不更新,但是下個版本具體有沒有更新又不確定峭判,在不影響用戶為前提的情況下开缎,只是使用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版本的兼容處理