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ù)庫緩存,兼容處理

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ù)。

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

存在問題
1.切換用戶單例需要銷毀
解決線程dispatch_once線程的dispatch_once_t *predicate設(shè)置成0,就會再次執(zhí)行。線程設(shè)置成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不同步,臨時字典保存,反轉(zhuǎn)。臨時解決一下。
解決看下圖。通過臨時值保持,注意模型有數(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目錄
首先思考有二個方案,結(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版本的兼容處理
