iOS 시스템 캐 시 개발 에 관 한 기초
때때로 같은 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 와 같은 저장 정책 의 캐 시 데 이 터 를 정리 합 니 다.다른 매개 변 수 를 바 꾸 면 해당 저장 정책 의 캐 시 데 이 터 를 정리 할 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.