app ios 删缓存
2015-10-09 17:11:59 baidu_31170383 阅读数 2006
- (void)viewDidLoad {
    [super viewDidLoad];
   
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 100, 100, 100);
    [button setTitle:@"清理缓存" forState:UIControlStateNormal];
    [button setTitleColor:[UIColor cyanColor] forState:UIControlStateNormal];
    button.layer.cornerRadius = 5;
    button.layer.masksToBounds = YES;
    [button addTarget:self action:@selector(clearCache) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button];
}


#pragma mark -检查缓存
- (void)clearCache{
    
    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
    NSFileManager *fileManager=[NSFileManager defaultManager];
    float folderSize;
    if ([fileManager fileExistsAtPath:path]) {
        //拿到算有文件的数组
        NSArray *childerFiles = [fileManager subpathsAtPath:path];
        //拿到每个文件的名字,如有有不想清除的文件就在这里判断
        for (NSString *fileName in childerFiles) {
            //将路径拼接到一起
            NSString *fullPath = [path stringByAppendingPathComponent:fileName];
            folderSize += [self fileSizeAtPath:fullPath];
        }
        
        self.alertView = [[UIAlertView alloc] initWithTitle:@"清理缓存" message:[NSString stringWithFormat:@"缓存大小为%.2fM,确定要清理缓存吗?", folderSize] delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil];
        [self.alertView show];
        self.alertView.delegate = self;
    }
}

//计算单个文件夹的大小
-(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;
}


#pragma mark -弹框

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex) {
        //点击了确定,遍历整个caches文件,将里面的缓存清空
        NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        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];
            }
        }
    }
    
    self.alertView = nil;
}

2016-10-10 17:44:00 weixin_33825683 阅读数 2

1,移除Xcode archive 中已经过期的app,文件夹中删除即可。
~/Library/Developer/Xcode/Products

2,Xcode证书路径:
~/Library/MobileDevice/Provisioning Profiles

3,Xcode编译项目缓存垃圾的目录:
~/Library/Developer/Xcode/DerivedData

4,Jenkines共享证书路径:
/用户/共享/Jenkins/Library/MobileDevice/Provisioning Profiles

2018-07-31 16:24:00 weixin_34166472 阅读数 64

- (CGFloat)getCachSize {

    NSUIntegerimageCacheSize = [[SDImageCachesharedImageCache]getSize];

    //获取自定义缓存大小

    //用枚举器遍历 一个文件夹的内容

    //1.获取 文件夹枚举器

    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];

    NSDirectoryEnumerator*enumerator = [[NSFileManagerdefaultManager]enumeratorAtPath:myCachePath];

    __blockNSUIntegercount =0;

    //2.遍历

    for(NSString*fileNameinenumerator) {

        NSString*path = [myCachePathstringByAppendingPathComponent:fileName];

        NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];

        count += fileDict.fileSize;//自定义所有缓存大小

    }

    // 得到是字节  转化为M

    CGFloattotalSize = ((CGFloat)imageCacheSize+count)/1024/1024;

    returntotalSize;

}


- (void)handleClearView {

    //删除两部分

    //1.删除 sd 图片缓存

    //先清除内存中的图片缓存

    [[SDImageCache sharedImageCache] clearMemory];

    //清除磁盘的缓存

    [[SDImageCache sharedImageCache] clearDisk];

    //2.删除自己缓存

    NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];

    [[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];

}

2017-03-03 15:12:26 jeffasd 阅读数 1402

http://www.tuicool.com/articles/JVbmuye?from=singlemessage&isappinstalled=1

此前,我在V2EX上请教” iOS app REST api缓存方案 “,也请教过一些朋友,发现不少人都遇到同样的问题。在网上搜索最佳实践的时候,没有找到比较满意的解决方案,所以在这里总结一下我的经验。

现在很多iOS App都是采取Client-Server这种架构,App端的数据都是从服务器获取的。我现在开发的App,一方面考虑到打开App的时候一片空白不太好看,另一方面需要在用户离线的情况下也能查看他的使用券。所以在一开始的时候,就需要研究缓存策略的问题。

经过google后,我发觉有以下几种缓存方案:

  1. 自己手写保存、读取core data
  2. 使用RestKit(https://github.com/RestKit/RestKit)
  3. AFIncrementalStore
  4. 利用iOS的api,NSURLCache

这几种google出来的方案,因为我自己也不是很了解,所以当时也不敢下判断哪种更好,毕竟一旦开始coding,再改回来,就要耗费不少功夫。

后来,yellowV2ex回答了我之前在V2EX提的问题:

我是把网址和参数组成一个key,然后把读到的内容value存进去,读的时候先读上次缓存的结果,同步读取网络,如果有不同则立即更新界面,因为是统一接口,所以全局网络读取都自动有了缓存机制。

这种办法可以一次过缓存所有的请求,解决了没有网络时,打开App没任何内容的问题。但是,才去这种办法的话,很有可能服务器的数据已经改变了,而App还在显示旧的数据。

跟着这个思路,后来我读到一篇关于Restful client api设计的文章,里面讨论到缓存的两种模式,Expiration model和Validation model,我才豁然开朗,因为资源储存在服务器端,必须要由服务器端来决定缓存策略。客户端要做的事情,仅是利用服务端返回的cache-control header,来实现缓存。

如果有兴趣建立良好的Restful api,建议阅读 这篇文章 。

最后,总结一下我的解决方案:

  1. 由服务器通过cache-control header来决定缓存策略。
  2. 客户端使用AFNetworking,并通过自定义NSCache实现缓存。需要注意的是,iOS客户端要调用NSCache,服务器必须返回cache-control header。

另外,对于我现在开发的Klook iOS App来说,最重要的莫过于大量图片资源的缓存。因为我现在做的App使用七牛作为CDN,七牛返回的请求已经配置了cache-control header,所以ios端我使用UIImageView + AFNetworking,图片就自动实现缓存了。


2017-09-24 10:32:28 luolianxi 阅读数 9886

可以好不夸张的说,网上很多清空缓存的例子都存在这样活着那样的错误,要么不准确,要么清理不彻底。

另外,很多地方计算缓存时转换单位的那一步,都是按1024计算,经过本人数十次验证,应该按1000计算。

本人的这个demo也有参考网友的demo,但是进行了大修复。

以下是一个封装的工具类: 

 .h文件

复制代码
#import <Foundation/Foundation.h>

@interface ClearCacheTool : NSObject

/**
 *  获取缓存大小
 */
+ (NSString *)getCacheSize;


/**
 *  清理缓存
 */
+ (BOOL)clearCaches;

@end
复制代码

.m文件

复制代码

#import "ClearCacheTool.h"

 

#define fileManager [NSFileManager defaultManager]

 

#define cachePath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]

 

@implementation ClearCacheTool

 

// 获取cachePath路径下文件夹大小

+ (NSString *)getCacheSize {

    

    // 调试

    #ifdef DEBUG

    // 如果文件夹不存在或者不是一个文件夹那么就抛出一个异常

    // 抛出异常会导致程序闪退,所以只在调试阶段抛出,发布阶段不要再抛了,不然极度影响用户体验

    BOOL isDirectory = NO;

    BOOL isExist = [fileManager fileExistsAtPath:cachePath isDirectory:&isDirectory];

    if (!isExist || !isDirectory) {

        NSException *exception = [NSException exceptionWithName:@"文件错误" reason:@"请检查你的文件路径!" userInfo:nil];

        [exception raise];

    }

    //发布

    #else

    #endif

    

    //获取“cachePath”文件夹下面的所有文件

    NSArray *subpathArray= [fileManager subpathsAtPath:cachePath];

    

    NSString *filePath = nil;

    long long totalSize = 0;

    

    for (NSString *subpath in subpathArray) {

        // 拼接每一个文件的全路径

        filePath =[cachePath stringByAppendingPathComponent:subpath];

 

        // isDirectory,是否是文件夹,默认不是

        BOOL isDirectory = NO;

        

        // isExist,判断文件是否存在

        BOOL isExist = [fileManager fileExistsAtPath:filePath isDirectory:&isDirectory];

        

        // 文件不存在,是文件夹,是隐藏文件都过滤

        if (!isExist || isDirectory || [filePath containsString:@".DS"]) continue;

   

        // attributesOfItemAtPath 只可以获得文件属性,不可以获得文件夹属性,这个也就是需要遍历文件夹里面每一个文件的原因

        long long fileSize = [[fileManager attributesOfItemAtPath:filePath error:nil] fileSize];

        totalSize += fileSize;

    }

    

    // 将文件夹大小转换为 M/KB/B

    NSString *totalSizeString = nil;

    

    if (totalSize > 1000 * 1000) {

        totalSizeString = [NSString stringWithFormat:@"%.1fM",totalSize / 1000.0f /1000.0f];

    } else if (totalSize > 1000) {

        totalSizeString = [NSString stringWithFormat:@"%.1fKB",totalSize / 1000.0f ];

    } else {

        totalSizeString = [NSString stringWithFormat:@"%.1fB",totalSize / 1.0f];

    }

    return totalSizeString;

}

 

 

// 清除cachePath文件夹下缓存大小

+ (BOOL)clearCaches {

    

    // 拿到cachePath路径的下一级目录的子文件夹

    // contentsOfDirectoryAtPath:error:递归

    // subpathsAtPath:不递归

    NSArray *subpathArray = [fileManager contentsOfDirectoryAtPath:cachePath error:nil];

    // 如果数组为空,说明没有缓存或者用户已经清理过,此时直接return

    if (subpathArray.count == 0) {

        #ifdef DEBUG

        NSLog(@"此缓存路径很干净,不需要再清理了");

        #else

        #endif

        return NO;

    }

    

    NSError *error = nil;

    NSString *filePath = nil;

    

    BOOL flag = NO;

    for (NSString *subpath in subpathArray) {

        

        filePath = [cachePath stringByAppendingPathComponent:subpath];

        

        if ([fileManager fileExistsAtPath:cachePath]) {

          // 删除子文件夹

          BOOL isRemoveSuccessed = [fileManager removeItemAtPath:filePath error:&error];

 

            if (isRemoveSuccessed) { // 删除成功

                flag = YES;

            }

        }

    }

    if (NO == flag) {

        #ifdef DEBUG

        NSLog(@"提示:您已经清理了所有可以访问的文件,不可访问的文件无法删除");  // 调试阶段才打印

        #else

        #endif

    }

    return flag;

}

@end

534254352345

博文 来自: u013086755
没有更多推荐了,返回首页