iOS가 캐싱을 처리하는 세 가지 방법
9601 단어 iOS
1. 소셜 애플리케이션의 포스트 브라우징과 같은 URL 캐싱, URL 캐싱은 viewDidAppear:에서 수행되어야 합니다. 간단히 말해서 AppDelegate.m에서 먼저 NSURLCache 클래스를 사용하십시오.
- (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의 구현 메소드 :
//네트워크 캐시 응답 방식
- (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(@"=========================================================
");
NSLog(@"post缓存测试:%@",str);
NSLog(@"=========================================================
");
}];
}
//네트워크 요청에 대한 메모리 캐시 메서드
-(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. 사용자 정보 및 기타 기본적으로 변경되지 않은 정보와 같은 파일 캐시는 로컬 샌드박스에 저장됩니다.
//사용자 정보 캐시는 파일과 함께 샌드박스에 저장됩니다.
- (IBAction)userCache:(UIButton *)sender {
self.UserPath = [self saveFileToDocuments:@"http://www.weather.com.cn/data/sk/101020100.html"];
}
//保存文件到沙箱
- (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(@"文件已下载
");
resultFilePath = destFilePath;
} else {
NSLog(@"没有缓存,请求数据
");
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(@"=========================================================
");
NSLog(@"user:%@",str);
NSLog(@"=========================================================
");
return resultFilePath;
}
3. 이미지 캐쉬가 가장 중요하고 자유트래픽도 메모리를 차지하므로 타사 SDWebImage 사용을 권장합니다.
가장 쉬운 방법은 이 방법을 사용하는 것입니다.
[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(@"有缓存,从内存读取");
}
}];
이 방법의 내부 메커니즘을 알고 싶다면 여기.
데모를 원하시면 여기에서 다운로드로 가세요.
출처를 밝혀주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.