先說遇到的問題豆胸,
項目的業(yè)務(wù)邏輯中奥洼,有巡檢的單子派發(fā)到某個人之后,需要先進行開始巡檢配乱,然后逐項巡檢溉卓,最后提交保存。
問題出現(xiàn)在搬泥,在開始巡檢的時候桑寨,速度會非常之慢。主要表現(xiàn)在數(shù)據(jù)庫有50萬條數(shù)據(jù)(單子)忿檩。每一個巡檢項尉尾,從模板表寫入到巡檢錄入中間表的時候,打印日志顯示4秒平均一個燥透。然而每天會有100+的單子沙咏,每個單子30~40項不等的巡檢項,可想而知會有多慢班套。
受不了當(dāng)前的速度肢藐,就開始打斷點查找原因
最終定位問題在下面這個方法:
+ (NSString *)getInspectionContensID {
NSString *uuidString = [WJHUUIDManager getUUIDString];
NSString *sql = [NSString stringWithFormat:@" SELECT ID FROM om_on_inspection_entry_mg "];
NSMutableArray *uuidArray = [[WJHDBManager sharedManager] selectWithSql:sql andOneArr:@[@"ID"]];
if (uuidArray.count == 0) {
return uuidString;
}else {
for (NSArray *arr in uuidArray) {
if ([[[arr firstObject] objectForKey:@"ID"] isEqualToString:uuidString]) {
return [WJHUUIDManager getInspectionContensID];
}else {
return uuidString;
}
}
}
}
每一個巡檢項都需要一個UUID來唯一確定,為了不和已有的UUID重復(fù)吱韭,這里就是來防止重復(fù)的吆豹。
顯然問題是很明顯的,50萬級別的數(shù)據(jù)理盆,每次都去數(shù)據(jù)庫中查一遍痘煤,然后再作比對,很明顯猿规,時間都浪費在查詢上了衷快。下面,就開始介紹 static如何幫助到我的姨俩。
首先蘸拔,static 靜態(tài)變量:
1.作用于變量:
用static聲明局部變量時,則改變變量的存儲方式(生命期)环葵,使變量成為靜態(tài)的局部變量都伪,即編譯時就為變量分配內(nèi)存,直到程序退出才釋放存儲單元积担。這樣陨晶,使得該局部變量有記憶功能,可以記憶上次的數(shù)據(jù),不過由于仍是局部變量先誉,因而只能在代碼塊內(nèi)部使用(作用域不變)
用static聲明外部變量-------外部變量指在所有代碼塊{}之外定義的變量湿刽,它缺省為靜態(tài)變量,編譯時分配內(nèi)存褐耳,程序結(jié)束時釋放內(nèi)存單元诈闺。
同時 其作用域很廣,整個文件都有效甚至別的文件也能引用它铃芦。為了限制某些外部變量的作用域雅镊,使其只在本文件中有效,而不能被其他文件引用刃滓,
可以用static 關(guān)鍵字對其作出聲明仁烹。
靜態(tài)變量的優(yōu)點:
1、節(jié)省內(nèi)存咧虎。靜態(tài)變量只存儲一處卓缰,但供所有對象使用。
2砰诵、它的值是可以更新的征唬。
3、可提高時間效率茁彭。只要某個對象對靜態(tài)變量更新一次总寒,所有的對象都能訪問更新后的值。
另:
2.作用于函數(shù):使用static用于函數(shù)定義時理肺,對函數(shù)的連接方式產(chǎn)生影響摄闸,使得函數(shù)只在本文件內(nèi)部有效,對其他文件是不可見的哲嘲。這樣的函數(shù)又叫作靜態(tài)函數(shù)。使用靜態(tài)函數(shù)的好處是媳禁,不用擔(dān)心與其他文件的同名函數(shù)產(chǎn)生干擾眠副,另外也是對函數(shù)本身的一種保護機制。如果想要其他文件可以引用本地函數(shù)竣稽,則要在函數(shù)定義時使用關(guān)鍵字extern囱怕,表示該函數(shù)是外部函數(shù),可供其他文件調(diào)用毫别。另外在要引用別的文件中定義的外部函數(shù)的文件中娃弓,使用extern聲明要用的外部函數(shù)即可。
以上是對其的解釋岛宦,總之台丛,現(xiàn)在我優(yōu)化的方向就是,這些巡檢項的UUID我只查詢一次就存儲起來,之后挽霉,直接拿來用防嗡,這樣速度可定就很快了,而且生成了新的就及時的添加到新的存儲中侠坎。
如此蚁趁,便優(yōu)化到了下面
static NSMutableArray *inspectionUUID;
@implementation WJHUUIDManager
+ (NSMutableArray *)readLocalFile {
static dispatch_once_t predicate;
dispatch_once(&predicate, ^{
NSString *sql = [NSString stringWithFormat:@" SELECT ID FROM om_on_inspection_entry_mg "];
inspectionUUID = [[WJHDBManager sharedManager] selectWithSql:sql andOneArr:@[@"ID"]];
});
return inspectionUUID;
}
+ (NSString *)getInspectionContensIDWithContentID:(NSMutableArray *)contentID {
NSString *uuidString = [WJHUUIDManager getUUIDString];
if (contentID.count == 0) {
inspectionUUID = [WJHUUIDManager readLocalFile];
if (inspectionUUID.count == 0) {
return uuidString;
}else {
if ([inspectionUUID containsObject:uuidString]) {
[inspectionUUID addObject:uuidString];
return [WJHUUIDManager getInspectionContensIDWithContentID:inspectionUUID];
}else {
return uuidString;
}
}
}else {
if ([contentID containsObject:uuidString]) {
[contentID addObject:uuidString];
return [WJHUUIDManager getInspectionContensIDWithContentID:contentID];
}else {
return uuidString;
}
}
}
@end
這樣,就實現(xiàn)了实胸,只查詢一次所有的巡檢項的UUID他嫡,并將其存儲起來,之后的直接拿來比較就好庐完。
最后钢属,速度上的提升是這樣的。 同一個巡檢單假褪,之前是3分鐘署咽,優(yōu)化之后,也就6s吧生音。哈哈宁否,問題解決了。