【iOS】利用NSCache提升效率
阿新 • • 發佈:2019-02-14
遇到一個問題是,在使用大量圖片的app中,需要從儲存裡面讀取資料,每次都從檔案系統裡面讀取檔案會造成卡頓現象。
解決辦法就是把NSData物件快取起來,先從NSCache裡面讀取資料,然後再從檔案系統獲取資料,提高效率。
方法如下:
步驟1:需要一個單例的NSCache,由於我們的FileUtil本來就是單例的,所以只是需要在初始化FileUtil的時候例項出一個NSCache就行了。
_cache = [[NSCache alloc] init];
步驟2:寫檔案的時候,把NSData存入NSCache裡面
-(void)write:(NSData*)data forKey:(NSString*)key { NSString *filepath = [self filePathForKey:key]; [_cache setObject:data forKey:key]; dispatch_async(fileQueue, ^{ [[NSFileManager defaultManager] createFileAtPath:filepath contents:data attributes:nil]; }); }
步驟3:讀檔案時候,先從NSCache裡面讀取,如果沒有再從檔案系統中讀取。從檔案系統中讀取到的資料,再放回到NSCache中。
-(NSData*)readForKey:(NSString*)key { if(key==nil){ return nil; } NSData *cacheData = [_cache objectForKey:key]; if(cacheData){ NSLog(@"get data from cache"); return cacheData; }else{ NSLog(@"miss data from cache"); NSString *filepath =[self filePathForKey:key]; NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:filepath]; if(fileData){ [_cache setObject:fileData forKey:key]; } return fileData; } }
總結:通過這樣的方式,形成了 記憶體 -> 檔案系統 -> 網路圖片 的三級圖片訪問系統。