ios-緩衝處理

來源:互聯網
上載者:User

標籤:

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-緩衝處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.