iOS 시스템 캐 시 개발 에 관 한 기초

8946 단어 iOS캐 시
1.같은 URL 에 대한 여러 번 의 요청
 
때때로 같은 URL 에 여러 번 요청 하면 되 돌아 오 는 데 이 터 는 똑 같 을 수 있 습 니 다.예 를 들 어 서버 에 있 는 한 그림 은 몇 번 을 다운로드 하 든 되 돌아 오 는 데 이 터 는 똑 같 습 니 다.
위의 상황 은 다음 과 같은 문 제 를 일 으 킬 수 있다.
 
(1)사용자 데이터 의 낭비
 
(2)프로그램 응답 속도 가 빠 르 지 않 음
 
위의 문 제 를 해결 하려 면 일반적으로 데 이 터 를 캐 시 하 는 것 을 고려한다.
 
 
캐 시
 
프로그램의 응답 속 도 를 높이 기 위해 캐 시(메모리 캐 시\하 드 디스크 캐 시)를 사용 하 는 것 을 고려 할 수 있 습 니 다.

데 이 터 를 처음 요청 할 때 메모리 캐 시 에 데이터 가 없고 하 드 디스크 캐 시 에 데이터 가 없습니다.
 
캐 시 데이터 의 과정

서버 가 데 이 터 를 되 돌려 줄 때 다음 절 차 를 밟 아야 합 니 다.
 
(1)서버 데이터 사용(예 를 들 어 분석,표시)
 
(2)서버 의 데 이 터 를 하 드 디스크 에 캐 시 합 니 다(샌 드 박스)
 
이 때 캐 시 는 메모리 캐 시 에 데이터 가 있 고 하 드 디스크 캐 시 에 데이터 가 있 습 니 다.
 
재 요청 데 이 터 는 두 가지 상황 으로 나 뉜 다.
 
(1)프로그램 이 닫 히 지 않 으 면 계속 실 행 됩 니 다.
 
그러면 메모리 캐 시 에 데이터 가 있 고 하 드 디스크 캐 시 에 데이터 가 있 습 니 다.이때 데 이 터 를 다시 요청 하면 메모리 캐 시 에 있 는 데 이 터 를 직접 사용 하면 됩 니 다.
 
(2)프로그램 이 다시 시작 되면
 
그러면 메모리 캐 시가 사 라 졌 고 데이터 가 없 으 며 하 드 디스크 캐 시가 존재 하고 데이터 도 있 습 니 다.이 때 데 이 터 를 다시 요청 하려 면 메모리 에 캐 시 된 데 이 터 를 읽 어야 합 니 다.
 
알림:하 드 디스크 캐 시 에서 데 이 터 를 읽 은 후 메모리 캐 시 에 또 데이터 가 있 습 니 다.
 
 
 
3.캐 시 실현
 
1.설명:
 
GET 요청 은 일반적으로 데 이 터 를 조회 하 는 데 사용 되 기 때문에 POST 요청 은 일반적으로 대량의 데 이 터 를 서버 에 보 내 처리 합 니 다(변동 성 이 비교적 큽 니 다).
 
따라서 POST 요청 대신 GET 요청 만 캐 시 합 니 다.
 
iOS 에 서 는 NSURLCache 클래스 캐 시 데 이 터 를 사용 할 수 있 습 니 다.
 
iOS 5 이전:메모리 캐 시 만 지원 합 니 다.iOS 5 부터:메모리 캐 시 와 하 드 디스크 캐 시 를 동시에 지원 합 니 다.
 
 
 
2.NSURLCache
 
iOS 의 캐 시 기술 은 NSURLCache 클래스 를 사 용 했 습 니 다.
 
캐 시 원리:NSURLRequest 에 대응 하 는 NSCachedurLResponse
 
캐 시 기술:캐 시 된 데 이 터 를 데이터베이스 에 저장 합 니 다.
 
 
 
3.NSURLCache 의 흔 한 용법
 
(1)전역 캐 시 대상 가 져 오기(수 동 으로 만 들 필요 없 음)NSURLCache*cache=[NSURLCache sharedURLCache];
 
(2)메모리 캐 시 최대 용량 설정(바이트 단위,기본 값 512 KB)-(void)setMemory Capacity:(NSUInteger)memory Capacity;
 
(3)하드디스크 캐 시의 최대 용량(바이트 단위,기본 값 은 10M)-(void)setDiskCapacity:(NSUInteger)diskCapacity 를 설정 합 니 다.
 
(4)하 드 디스크 캐 시 위치:샌 드 박스/Library/caches
 
(5)요청 한 캐 시 를 가 져 옵 니 다.-(NSCachedurLResponse*)cached ResponseForRequest:(NSURLRequest*)request;
 
(6)요청 한 캐 시 삭제-(void)removeCached ResponseForRequest:(NSURLRequest*)request;
 
(7)모든 캐 시 삭제-(void)removeAllCached Responses;
 
 
 
4.캐 시 GET 요청
 
어떤 GET 요청 에 대해 데이터 캐 시 를 하려 면 매우 간단 합 니 다.
 

  NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
 
  //
 
  request.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
 
캐 시 정책 만 설정 하면 시스템 은 자동 으로 NSURLCache 를 이용 하여 데이터 캐 시 를 진행 합 니 다.
 
 
 
5.iOS 는 NSURLRequest 에 7 가지 캐 시 정책 을 제공 합 니 다.(실제로 사용 할 수 있 는 것 은 4 가지 입 니 다)
 
 
NSURLRequestUseProtocolCachePolicy // ( )
 
NSURLRequestReloadIgnoringLocalCacheData // ,
 
NSURLRequestReloadIgnoringLocalAndRemoteCacheData //
 
NSURLRequestReloadIgnoringCacheData = NSURLRequestReloadIgnoringLocalCacheData // ,
 
NSURLRequestReturnCacheDataElseLoad// ,
 
NSURLRequestReturnCacheDataDontLoad// , , ( )
 
NSURLRequestReloadRevalidatingCacheData //

 

 
6.캐 시 주의사항
 
캐 시 설정 은 URL 의 데 이 터 를 되 돌려 달라 고 요청 할 경우 구체 적 인 상황 을 고려 해 야 합 니 다.
 
(1)자주 업데이트:캐 시 를 사용 할 수 없습니다!예 를 들 어 주식,복권 데이터
 
(2)변 함 없 음:캐 시 를 과감하게 사용 합 니 다.
 
(3)가끔 업데이트:캐 시 정책 을 정기 적 으로 변경 하거나 캐 시 를 지 울 수 있 습 니 다.
 
알림:캐 시 를 많이 사용 하면 쌓 일 수록 캐 시 를 정기 적 으로 지 우 는 것 을 권장 합 니 다.
4.로 컬 캐 시 개발 관련
데이터 절약 과 더 좋 은 사용자 체험 을 위해 현재 많은 응용 프로그램 이 로 컬 캐 시 메커니즘 을 사용 하 는데 그 중에서 왕 이 뉴스의 캐 시 기능 이 가장 뛰어나다.제 응용 프로그램 도 로 컬 캐 시 기능 에 가입 하고 싶 습 니 다.그래서 저 는 인터넷 에서 관련 자 료 를 찾 아 보 았 는데 전체적으로 두 가지 방법 이 있다 는 것 을 알 게 되 었 습 니 다.하 나 는 스스로 캐 시 를 쓰 는 처리 이 고,하 나 는 ASIHTP Request 의 ASIDownloadCache 를 사용 하 는 것 입 니 다.
방법 1:일반적으로 서버 가 처음으로 돌아 온 데 이 터 를 샌 드 박스 에 저장 합 니 다.이렇게 하면 휴대 전화 가 끊 긴 상태 에서 현지에서 데 이 터 를 읽 을 수 있다.
1.샌 드 박스 에 저장 할 코드:
 

+ (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str; 

    NSUserDefaults * setting = [NSUserDefaults standardUserDefaults]; 
    NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id]; 
    [setting setObject:str forKey:key]; 
    [setting synchronize]; 

2.로 컬 샌 드 박스 의 코드 읽 기
 
읽 기 전에 type 과 Id 에 따라 로 컬 이 있 는 지 여 부 를 판단 합 니 다.
 

+ (NSString *)getCache:(int)type andID:(int)_id 

    NSUserDefaults * settings = [NSUserDefaults standardUserDefaults]; 
    NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id]; 
     
    NSString *value = [settings objectForKey:key]; 
    return value; 

하면,만약,만약...
 

NSString *value = [Tool getCache:5 andID:self.QiuTime]; 
        if (value) { 
            NSDictionary *backdict = [value JSONValue]; 
            if ([backdict objectForKey:@"items"]) { 
                NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]]; 
                for (NSDictionary *qiushi in array) { 
                    QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease]; 
                    [self.list addObject:qs]; 
                } 
            } 
            [self.tableView reloadData]; 
            
        } 
         
        [self.tableView tableViewDidFinishedLoadingWithMessage:@" .."]; 
        self.tableView.reachedTheEnd  = YES; 


방법 2:ASIHTTRequest 와 ASIDownloadCache 를 사용 하여 로 컬 캐 시 구현
 
1.전역 적 인 Cache 설정
    AppDelegate.h 에 전역 변 수 를 추가 합 니 다.

@interface AppDelegate : UIResponder  

    ASIDownloadCache *myCache; 

@property (strong, nonatomic) UIWindow *window; 
@property (nonatomic,retain) ASIDownloadCache *myCache; 

   AppDelegate.m 에 있 는-(BOOL)application:(UIApplication*)application didFinishLaunching WithOptions:(NSDictionary*)launchOptions 방법 에 다음 코드 를 추가 합 니 다.

//  
ASIDownloadCache *cache = [[ASIDownloadCache alloc] init]; 
self.myCache = cache; 
[cache release]; 
     
//  
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentDirectory = [paths objectAtIndex:0]; 
[self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]]; 
[self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy]; 
  
 
    AppDelegate.m 의 dealloc 방법 에 다음 문 구 를 추가 합 니 다.
 

[myCache release]; 

    여기까지 전역 변수의 성명 을 마 쳤 습 니 다.
 
    2.캐 시 정책 설정
    ASIHTTPRequest 요청 이 실 행 된 곳 에 request 의 저장 방식 을 설정 합 니 다.코드 는 다음 과 같 습 니 다.

NSString *str = @"http://....../getPictureNews.aspx"; 
NSURL *url = [NSURL URLWithString:str]; 
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
//  
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
//  
[request setDownloadCache:appDelegate.myCache]; 
// ,  
[request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy]; 
request.delegate = self; 
[request startAsynchronous]; 

    3.캐 시 데이터 정리
 
    제 가 여기 서 사용 하 는 것 은 수 동 으로 데 이 터 를 정리 하 는 방식 입 니 다.적당 한 곳 에 다음 과 같은 코드 를 추가 하고 저 는 응용 설정 모듈 에 천천히 저장 할 것 입 니 다.

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
[appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];  
 

    ASICachePermanently CacheStoragePolicy 와 같은 저장 정책 의 캐 시 데 이 터 를 정리 합 니 다.다른 매개 변 수 를 바 꾸 면 해당 저장 정책 의 캐 시 데 이 터 를 정리 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기