• iOS利用SDWebImage实现缓存的计算与清理


    概述

    可以仅仅清理图片缓存, 也可以清理所有的缓存文件(包括图片、视频、音频等).

    详细

    一般我们项目中的缓存一般分为2大块:一个是自己缓存的一些数据;还有一个就是我们使用的SDWebImage这个第三方库给我们自动缓存的图片文件缓存了.

    实际项目中会配合设置里去清理缓存, 效果截图如下:

    实际项目截图.jpeg

    一、实现功能

    1、仅仅清理图片缓存

    2、清理所有缓存文件

    二、程序实现

    1、仅仅清理图片缓存

    如果你只想清理图片缓存,且是用SDWebImage加载的网络图片,那么你可以用SDWebImage内部封装方法清除图片缓存.

    导入头文件:

    #import <SDImageCache.h>

    获取缓存图片大小并异步清除图片缓存:

    //获取缓存图片的大小(字节)
    NSUInteger bytesCache = [[SDImageCache sharedImageCache] getSize];
    //换算成 MB (注意iOS中的字节之间的换算是1000不是1024)
    float MBCache = bytesCache/1000/1000;
    //异步清除图片缓存 (磁盘中的)
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        [[SDImageCache sharedImageCache] clearDisk];
    });

    2、清理所有缓存文件

    如果你想清理所有的缓存文件(包括图片、视频、音频等), 那你可以用如下方法。需要你把caches的路径传过去,然后计算caches文件夹下内容的大小,然后根据其大小再判断是否清除缓存。(根据路径删除文件或文件夹)

    为了让代码看起来更整洁,这里将缓存的计算及清理封装自定义一个工具类CleanCaches.

    利用SDWebImage计算并清理缓存:

    1. 计算单个文件大小:

    + (float)fileSizeAtPath:(NSString *)path {
        NSFileManager *fileManager=[NSFileManager defaultManager];
        if([fileManager fileExistsAtPath:path]){
            long long size=[fileManager attributesOfItemAtPath:path error:nil].fileSize;
            return size/1024.0/1024.0;
        }
        return 0;
    }

    2. 计算文件夹大小(要利用上面的1提供的方法)

    + (float)folderSizeAtPath:(NSString *)path {
        NSFileManager *fileManager=[NSFileManager defaultManager];
        float folderSize;
        if ([fileManager fileExistsAtPath:path]) {
            NSArray *childerFiles=[fileManager subpathsAtPath:path];
            for (NSString *fileName in childerFiles) {
                NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
                folderSize += [self fileSizeAtPath:absolutePath];
            }
            // SDWebImage框架自身计算缓存的实现
            folderSize+=[[SDImageCache sharedImageCache] getSize]/1024.0/1024.0;
            return folderSize;
        }
        return 0;
    }

    3. 清除缓存:

    + (void)clearCache:(NSString *)path {
        NSFileManager *fileManager=[NSFileManager defaultManager];
        if ([fileManager fileExistsAtPath:path]) {
            NSArray *childerFiles=[fileManager subpathsAtPath:path];
            for (NSString *fileName in childerFiles) {
                //如有需要,加入条件,过滤掉不想删除的文件
                NSString *absolutePath=[path stringByAppendingPathComponent:fileName];
                [fileManager removeItemAtPath:absolutePath error:nil];
            }
        }
        [[SDImageCache sharedImageCache] cleanDisk];
    }

    然后只需要在所使用的控制器里调取计算和清理缓存的方法即可:

     // 计算缓存大小
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
     NSString *cachesDir = [paths objectAtIndex:0];
     float size = [CleanCaches folderSizeAtPath:cachesDir];
      // 清理缓存
     [CleanCaches clearCache:cachesDir];

    三、压缩文件截图及运行效果

    1、压缩文件截图

    4F8B5D05-B8C2-4CA7-A21A-A071BCC3511C.png

    2、运行时的截图

    Demo 截图.png

    四、其他补充

    界面性问题可以根据自己项目需求调整即可, 具体可参考代码, 项目能够直接运行! 也可以把工具类直接拖到自己项目里使用!

    注:本文著作权归作者,由demo大师发表,拒绝转载,转载需要作者授权

  • 相关阅读:
    WPF Image Binding Uri Source 失败解决办法
    redis哈希表数据类型键的设置
    redis字符串类型键的二进制操作
    redis字符串类型的基本命令
    redis字符串数据类型基本概念和应用场景
    redis键的迁移操作
    redis键的排序操作
    Redis键的序列化和反序列化
    Redis过期命令
    Redis键的基本操作
  • 原文地址:https://www.cnblogs.com/demodashi/p/8486485.html
Copyright © 2020-2023  润新知