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(@"有缓存,从内存读取");

        }



    }];

이 방법의 내부 메커니즘을 알고 싶다면 여기.
데모를 원하시면 여기에서 다운로드로 가세요.
출처를 밝혀주세요!

좋은 웹페이지 즐겨찾기