iOS 处理缓存的三种方法

分类: 直播365体育 时间: 2026-07-12 14:00:39 作者: admin 阅读: 2358
iOS 处理缓存的三种方法

缓存处理是个相当头疼的事情,要根据需要综合应用不同的策略。总的来说有以下几种情况:

1.URL缓存,例如社交应用的帖子浏览,要在viewDidAppear:里面进行URL缓存。简单来说就是用NSURLCache类,首先在AppDelegate.m里面的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;方法里面创建一个NSURLCache的单例:

//设置内存缓存大小

NSURLCache *URLCache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:10 * 1024 * 1024 diskPath:nil];

[NSURLCache setSharedURLCache:URLCache];

然后的ViewController.m里面实现方法:

//网络缓存响应方法

代码语言:javascript复制- (IBAction)senderButton:(id)sender {

//天气Api接口

NSString* path = @"http://www.weather.com.cn/data/sk/101110101.html";

[self getByURL:path andCallBack:^(id obj) {

NSString *str = [[NSString alloc]initWithData:obj encoding:NSUTF8StringEncoding];

NSLog(@"=========================================================\n");

NSLog(@"post缓存测试:%@",str);

NSLog(@"=========================================================\n");

}];

}//网络请求的内存缓存方法

代码语言:javascript复制-(void)getByURL:(NSString *)path andCallBack:(CallBack)callback{

NSString* pathStr = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

NSURL *url = [NSURL URLWithString:pathStr];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

[request setCachePolicy:NSURLRequestReloadRevalidatingCacheData];

NSCachedURLResponse* response = [[NSURLCache sharedURLCache] cachedResponseForRequest:request];

//判断是否有缓存

if (response != nil) {

NSLog(@"有缓存");

[request setCachePolicy:NSURLRequestReturnCacheDataDontLoad];

}else{

NSLog(@"没有缓存");

}

//创建NSURLConnection

NSData* data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

callback(data);

}2.文件缓存,例如用户信息等基本不会变化的信息保存在本地沙箱

//用户信息缓存用文件保存在沙箱

代码语言:javascript复制- (IBAction)userCache:(UIButton *)sender {

self.UserPath = [self saveFileToDocuments:@"http://www.weather.com.cn/data/sk/101020100.html"];

}

代码语言:javascript复制//保存文件到沙箱

- (NSString *)saveFileToDocuments:(NSString *)url

{

NSString *resultFilePath = @"";

NSString *destFilePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:url]; // 加上url,组合成本地文件PATH

NSString *destFolderPath = [destFilePath stringByDeletingLastPathComponent];

// 判断路径文件夹是否存在不存在则创建

if (! [[NSFileManager defaultManager] fileExistsAtPath:destFolderPath]) {

NSLog(@"文件夹不存在,新建文件夹");

[[NSFileManager defaultManager] createDirectoryAtPath:destFolderPath withIntermediateDirectories:YES attributes:nil error:nil];

}

// 判断该文件是否已经下载过

if ([[NSFileManager defaultManager] fileExistsAtPath:destFilePath]) {

NSLog(@"文件已下载\n");

resultFilePath = destFilePath;

} else {

NSLog(@"没有缓存,请求数据\n");

NSData *userInfoData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];

if ([userInfoData writeToFile:destFilePath atomically:YES]) {

resultFilePath = destFilePath;

}

}

NSData *userInfoData=[[NSFileManager defaultManager] contentsAtPath:resultFilePath];

NSString* str = [[NSString alloc]initWithData:userInfoData encoding:NSUTF8StringEncoding];

NSLog(@"=========================================================\n");

NSLog(@"user:%@",str);

NSLog(@"=========================================================\n");

return resultFilePath;

}3.图片缓存是最重要的,费流量还占内存,所以推荐使用第三方SDWebImage

最简单的就是用这个方法:

代码语言:javascript复制[self.imageView sd_setImageWithURL:url completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {

if (cacheType==SDImageCacheTypeNone) {

NSLog(@"没有缓存,从网络下载");

}else if (cacheType==SDImageCacheTypeDisk){

NSLog(@"有缓存,从磁盘读取");

}else{

NSLog(@"有缓存,从内存读取");

}

}];想知道这个方法的内部机制请看这里。

想要demo的去这里下载。

相关文章

Shopee放款和物流规则,Shopee打款周期是多久?
《魔兽世界》中著名的传奇武器:毁灭之锤
使用 macOS 键盘快捷键