標籤:
1.哪些東西需要做緩衝? 經常改變的資料不需要做緩衝,不變的資料才需要做緩衝 圖片和微博介面的微博資料等,一般都不會改變,需要緩衝 2.項目中有哪些控制項或架構預設幫我們做了一些緩衝處理? WKWebView系統做了緩衝,SDWebImage 3.我們來到沙箱路徑下SDWebImage緩衝目錄,發現裡面的圖片名稱很特別,怎麼處理的? 首先,我們知道如果存在同名的檔案,後存入的檔案會把之前的覆蓋掉 為了防止被覆蓋,一般都會對檔案做加密處理 4.為什麼要加密? 加密就是對快取檔案處理得到不同的檔案名稱,防止被覆蓋 5.怎麼加密? 一般來說對快取檔案加密有兩種方式 1.拿到檔案位元據,先base64加密,然後再對加密得到的文字檔進行MD5加密 得到的散列值 作為檔案的名稱 2.直接對url進行MD5加密,散列值作為檔案名稱(SDWebImage就是這種方式) 6.如果兩個不同的url指向相同的圖片,採用上面第一種方法加密,得到的散列值是相同的 怎麼辦? 這個時候我們可以在進行MD5加密之前 對文字檔加鹽(日期,url,隨機數都可以作為鹽),這樣得到的散列值就不同了 7.怎麼擷取緩衝尺寸(大小)? 如果不會做緩衝處理,那麼我們可以查看SDWebImage怎麼做緩衝處理的 進入 SDImageCache.h檢視方塊架裡面怎麼處理的,我們發現很多方法來處理緩衝 - (void)storeImage:(UIImage *)image forKey:(NSString *)key; - (void)clearDisk; 清理磁碟緩衝 - (void)cleanDisk; 清理到期的磁碟緩衝 - (NSUInteger)getSize; 得到緩衝的尺寸 其它方法可以自己去標頭檔自己去查看,學習(有一份文頂頂翻譯的SDWebImage可以協助我們學習) 我們可以根據架構得到緩衝尺寸的方法,模仿一個自己的方法 8.怎麼模仿? 跳進去- (NSUInteger)getSize;方法裡面,分析方法怎麼實現的 然後模仿 //獲得磁碟快取檔案的總大小
- (NSUInteger)getSize { __block NSUInteger size = 0; //同步+串列隊列:在當前線程中執行block中的代碼
dispatch_sync(self.ioQueue, ^{
//得到diskCachePath路徑下面的所有子路徑
NSDirectoryEnumerator *fileEnumerator = [_fileManager enumeratorAtPath:self.diskCachePath];
//遍曆得到所有子路徑對應檔案的大小,並累加以計算所有檔案的總大小
for (NSString *fileName in fileEnumerator) {
//拼接檔案的全路徑
NSString *filePath = [self.diskCachePath stringByAppendingPathComponent:fileName];
//獲得指定檔案的屬性字典
NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:nil];
//累加檔案的大小 調用fileSize 獲得檔案的大小 == attrs["NSFileSzie"]
size += [attrs fileSize];
}
});
return size;} 9.分析之後我們總結擷取緩衝尺寸的步驟 9.1 建立檔案管理者對象 9.2 根據一個路徑擷取該路徑下所有檔案 9.3 遍曆所有檔案 9.4 拼接檔案的全路徑 9.5 擷取檔案屬性 9.6 把每一個檔案的尺寸(大小)累加起來 就是緩衝的大小 我們只要把路徑改一下,就能擷取指定檔案夾的尺寸(大小) // 擷取SDWebImage緩衝尺寸
- (void)getSize
{
// 擷取檔案夾路徑
NSString *cachePath = XMGCachePath;
NSString *defaultPath = [XMGCachePath stringByAppendingPathComponent:@"default"];
NSInteger totalSize = 0;
// 1.擷取檔案管理者對象
NSFileManager *mgr = [NSFileManager defaultManager];
// 2.擷取所有檔案(傳遞檔案夾路徑)
// Path:檔案夾路徑
// subpathsAtPath:擷取一個檔案夾中所有子路徑,包含多級路徑
NSArray *subPaths = [mgr subpathsAtPath:defaultPath];
// 3.遍曆所有檔案
for (NSString *subPath in subPaths) {
// 4.拼接完整檔案名稱
NSString *filePath = [defaultPath stringByAppendingPathComponent:subPath];
// 判斷下是否是隱藏檔案
if ([subPath hasPrefix:@".DS"]) continue;
// 是否是檔案夾
BOOL isDirectory;
// 判斷檔案是否存在,並且是否是檔案夾
[mgr fileExistsAtPath:filePath isDirectory:&isDirectory];
if (isDirectory) continue;
// 5.attributesOfItemAtPath:傳入檔案全路徑,就能擷取檔案屬性
NSDictionary *attr = [mgr attributesOfItemAtPath:filePath error:nil];
// 6.把檔案尺寸累加
totalSize += [attr fileSize]; } } 10.return break continue 的區別 return:直接跳出當前方法 break:直接跳出當前迴圈 continue:直接跳出本次迴圈,進入下一輪迴圈中 11.怎麼把緩衝大小展示到介面? 11.1首先我們先瞭解檔案大小的單位換算 在電腦上:1M = 1024KB 1KB = 1024B 在手機上:1M = 1000KB 1KB = 1000B 11.2我們可以先定義一個字串用來拼接緩衝大小 系統返回的緩衝大小以 B 為單位 我們需要展示最後的格式為: 清除緩衝(xxx B) 或 清除緩衝(xx.x KB) 或 清除緩衝(xx.x M) 1.拿到緩衝大小 2.判斷是否大於 1000 * 1000 大於的話就用 totalSize(緩衝大小) / (1000 * 1000) 保留一位小數 拿到得到的結果 拼接成清除緩衝(xx.x M) 3.判斷是否大於 1000 大於的話就用 totalSize(緩衝大小) / 1000 保留一位小數 拿到得到的結果 拼接成清除緩衝(xx.x KB) 4.都不滿足上麵條件 就直接拿totalSize拼接成 清除緩衝(xx.x KB) 5.然後把 .0 替換為空白 - (NSString *)cacheStr
{
// 計算Cache緩衝尺寸
NSInteger cacheSize = [self getSizeOfDirectoryPath:XMGCachePath]; CGFloat cacheSizeF;
NSString *sizeStr = @"清除緩衝";
if (cacheSize > 1000 * 1000) { // MB
cacheSizeF = cacheSize / (1000.0 * 1000.0);
sizeStr = [NSString stringWithFormat:@"%@(%.1fMB)",sizeStr,cacheSizeF];
} else if (cacheSize > 1000) { // KB
cacheSizeF = cacheSize / 1000.0;
sizeStr = [NSString stringWithFormat:@"%@(%.1fKB)",sizeStr,cacheSizeF];
} else if (cacheSize > 0) { // B
sizeStr = [NSString stringWithFormat:@"%@(%ldB)",sizeStr,cacheSize]; } 把.0 替換為空白 sizeStr = [sizeStr stringByReplacingOccurrencesOfString:@".0" withString:@""];
return sizeStr;} 12.怎麼清除緩衝? 查看SDWebImage清除緩衝的方法,我們可以總結清除緩衝的步驟 1.建立檔案管理者 2.刪除指定路徑下的檔案夾 3.建立一個空的檔案夾 注意:我們清除緩衝後一定要重新整理表格,才能讓展示的快取資料即時更新 // 點擊cell就會調用
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// 清空緩衝
NSFileManager *mgr = [NSFileManager defaultManager];
// 1.刪除Cache檔案夾
[mgr removeItemAtPath:XMGCachePath error:nil];
// 2.建立新Cache檔案夾
[mgr createDirectoryAtPath:XMGCachePath withIntermediateDirectories:YES attributes:nil error:nil]; // 重新整理表格 全域重新整理 [self.tableView reloadData];} // 局部重新整理(動畫重新整理)(刪除指定行並重新整理) NSArray *indexPaths = @[[NSIndexPath indexPathForRow:0 inSection:0]]; //插入指定行並重新整理 [self.tableView insertRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationTop]; NSArray *indexPaths = @[
[NSIndexPath indexPathForRow:0 inSection:0],
[NSIndexPath indexPathForRow:1 inSection:0] ]; //刪除指定行並重新整理 [self.tableView deleteRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationMiddle]; //重新整理指定行 self.tableView reloadRowsAtIndexPaths:<#(nonnull NSArray<NSIndexPath *> *)#> withRowAnimation:<# (UITableViewRowAnimation)#>
ios-緩衝處理