52가지 유효한 방법(50) - 캐시를 구축할 때 NSDictionary 대신 NSCache를 선택합니다.
NSCache
는 애플이 공식적으로 제공한 캐시 클래스로 사용법NSMutableDictionary
과 비슷하며 AFNetworking
과SDWebImage
에서 캐시를 관리한다.NSCache
는'가장 오랫동안 사용되지 않은'대상을 먼저 삭제합니다.)NSCache
는 키를 복사하지 않고 보존합니다. 대부분의 키 값은 복사를 지원하지 않는 대상에서 충당하기 때문입니다.NScache
는 라인이 안전하여 다중 라인 작업 중,Cache에 자물쇠를 채울 필요가 없습니다.NSCache
의 속성countLimit:
캐시할 수 있는 대상의 최대 수량이며 기본값은 0(제한 없음)이다.totalCostLimit :
캐시 공간의 최대 비용으로 한도를 초과하면 자동으로 대상을 회수합니다.기본값은 0입니다(제한 없음).evictsObjectsWithDiscardedContent:
는 폐기된 콘텐츠의 회수 여부를 나타내며 기본값은 YES(자동 회수)입니다.NSCache
방법objectForKey:
는 키 값과 관련된 대상을 되돌려줍니다.setObject: forKey:
캐시에 지정한 키 이름에 대응하는 값을 설정합니다.가변 사전과 달리 캐시 대상은 키 이름에 copy 작업을 하지 않습니다.setObject: forKey: cost:
캐시에 지정한 키 이름에 대응하는 값을 설정하고 이 키 값이 맞는 비용을 지정합니다.원가cost는 버퍼에 기록된 모든 대상의 총 원가를 계산하는 데 사용됩니다.메모리 경고가 발생하거나 캐시의 원가 상한선을 초과할 때 캐시는 회수 과정을 시작하여 일부 요소를 삭제합니다.removeObjectForKey:
캐시에서 지정한 키 이름의 대상을 삭제합니다.removeAllObjects:
캐시에서 모든 객체를 제거합니다.위탁 방법
cache: willEvictObject:
캐시가 대상을 삭제할 때 호출되며 이 방법에서 캐시를 수정할 수 없습니다.디버깅에 편리하도록 백그라운드 인쇄에만 사용됩니다.#import "ViewController.h"
@interface ViewController()
@property (nonatomic, strong) NSCache *myCache;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
for (int i =0 ; i< 5; i++) {
//
NSString *str = [NSString stringWithFormat:@"cache - %d", I];
[self.myCache setObject:str forKey:@(i)];
}
for (int i=0 ; i< 5; i++) {
NSLog(@"%@", [self.myCache objectForKey:@(i)]);
}
}
-(NSCache *)myCache
{
if (_myCache == nil) {
_myCache = [[NSCache alloc] init];
_myCache.countLimit = 3;
_myCache.delegate = self;
}
return _myCache;
}
#pragma mark- delegate
-(void)cache:(NSCache *)cache willEvictObject:(id)obj
{
NSLog(@" obj-------------%@", obj);
}
@end
NSPurgeableData
#import "ViewController.h"
@interface ViewController ()
{
NSCache *_cache;
}
@end
@implementation ViewController
- (instancetype)init
{
self = [super init];
if (self) {
_cache = [[NSCache alloc] init];
_cache.countLimit = 100;
_cache.totalCostLimit = 5 * 1024 * 1024;
}
return self;
}
- (void)downloadWithURL:(NSURL *)url
{
NSPurgeableData *cacheData = [_cache objectForKey:url];
if (cacheData) {
[cacheData beginContentAccess];
[self useData:cacheData];
[cacheData endContentAccess];
}else{
//network init
//network block -->data
{
NSPurgeableData *purgeableData = [[NSPurgeableData alloc] initWithData:data];
[_cache setObject:purgeableData forKey:url cost:purgeableData.length];
[self useData:cacheData];
[purgeableData endContentAccess];
}
}
}
- (void)useData:(NSPurgeableData *)data {}
@end
요점
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.