iOS中清理緩存的實現


App開發中,經常涉及到清理Cache的功能,特別對於新聞展示類的App,爲了提高頁面加載速度,大量的數據,需要在本地緩存,當緩存沒有一個比較規範的自動清理機制時,會造成程序佔用空間越來越大的情況,實時給用戶展示當前緩存數據的大小,讓用戶決定是否手動清理,是一個比較好的機制。最近也給華商韜略的iOS版本,加入了這一功能。

1. 新版華商韜略客戶端設置頁面:



2. iOS App中的目錄結構及功能

2.1 iOS App目錄結構

出於數據安全性的考慮,一個應用擁有自己獨立的目錄,用來寫入應用的數據或者首選項參數。應用安裝後,會有對應的home目錄,home內的子目錄功能如下:

  • AppName.app 存放應用程序自身

  • Documents/ 存放用戶文檔和應用數據文件

  • Library/ 應用程序規範的頂級目錄,用於存放應用的文件,不宜存放用戶數據文件,和Document一樣會被itunes同步,但不包括Caches

  • /Library/Preferences/ 這裏存放程序規範要求的首選項文件

  • Library/Cache/ 保存應用的持久化數據,用於應用升級或者應用關閉後的數據保存,不會被itunes同步,所以爲了減少同步的時間,可以考慮將一些比較大的文件而又不需要備份的文件放到這個目錄下

  • tmp/ 保持不需要持久化的應用數據,應用關閉戶,數據被清除

可見,我們關於數據的操作來說,主要需要涉及的就是Documents/,以及Library/Cache/,之前一直對Cache目錄的理解有點偏差,認爲會被應用程序自動清理,其實不然。如果是在啓動中需要使用的數據文件,可以放置在Library/Caches/下面,不建議放在Documents目錄下,該目錄下會備份,耗時。

2.2 獲取應用的各個目錄


  1. //獲取Cache路徑

  2. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);

  3. NSString *path = [paths objectAtIndex:0];

  4.  

  5. //獲取Documents路徑

  6. paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

  7. path  = [paths objectAtIndex:0];

3. 清理Cache功能的實現

爲了實現離線閱讀,需要在本地Cache大量的數據文件,而這些數據文件一般放在Caches目錄下,即通常所說的收藏的文章。而其他一些需要清理的Cache,也位於該大目錄下面,則需要遍歷Caches目錄,同時忽略一些特定的文件夾,進行文件大小的統計,進而展現給用戶當前Cache的大小。

3.1 遍歷應用的某個目錄並統計大小

- (float)checkTmpSize
{
    float totalSize = 0;
    NSString *path = [self getCachePath];
    NSDirectoryEnumerator *fileEnumerator = [[NSFileManager defaultManager] enumeratorAtPath: path];
    
    for (NSString *fileName in fileEnumerator) {
        NSString *filePath  = [path stringByAppendingPathComponent: fileName];
        NSDictionary *attrs = [[NSFileManager defaultManager] attributesOfItemAtPath: filePath error: nil];
        unsigned long long length = [attrs fileSize];
        
        if([[[fileName componentsSeparatedByString: @"/"] objectAtIndex: 0] isEqualToString: @"URLCACHE"])
            continue;
        
        totalSize += length / 1024.0 / 1024.0;
    }
    return  totalSize;
}

3.2 清理NSURLCache緩存的數據

開發中,一般基於NSURLCache來實現數據的Cache,NSURLCache會在Caches目錄下,以Bundle Identifier爲文件夾名建立Cache的存放路徑。可以將該目錄下的文件remove,實現清理Cache的功能。而如果使用了SDWebImageManager進行圖片加載,也可以順便使用其封裝的清理memory/disk的方法,清理其緩存的數據。

- (void)clearCache
{
    SDWebImageManager *manager = [SDWebImageManager sharedManager];
    [manager.imageCache clearDisk];
    [manager.imageCache clearMemory];
    NSString *identifier = [[NSBundle mainBundle] bundleIdentifier];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSString *base_path = [self getCachePath];
    NSString *path = [NSString stringWithFormat: @"%@/%@", base_path, identifier];
    [fileManager removeItemAtPath: path error: nil];
    
    tmpSize = [self checkTmpSize];
    [self.tableView reloadData];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章