52가지 유효한 방법(50) - 캐시를 구축할 때 NSDictionary 대신 NSCache를 선택합니다.

4489 단어
NSCache NSCache는 애플이 공식적으로 제공한 캐시 클래스로 사용법NSMutableDictionary과 비슷하며 AFNetworkingSDWebImage에서 캐시를 관리한다.
  • 시스템 자원이 소진될 때 캐시를 자동으로 삭제할 수 있습니다(NSCache는'가장 오랫동안 사용되지 않은'대상을 먼저 삭제합니다.)
  • NSCache는 키를 복사하지 않고 보존합니다. 대부분의 키 값은 복사를 지원하지 않는 대상에서 충당하기 때문입니다.
  • NScache는 라인이 안전하여 다중 라인 작업 중,Cache에 자물쇠를 채울 필요가 없습니다.
  • NSCache의 속성
  • countLimit: 캐시할 수 있는 대상의 최대 수량이며 기본값은 0(제한 없음)이다.
  • totalCostLimit : 캐시 공간의 최대 비용으로 한도를 초과하면 자동으로 대상을 회수합니다.기본값은 0입니다(제한 없음).
  • 캐시 최대 비용이나 수량을 초과할 때 NSCache는 앞의 데이터를 가장 먼저 저장한 것을 제거합니다.
  • 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
  • NSMutable Data의 하위 클래스이며 NSDiscardable Content 프로토콜을 구현했습니다.
  • 시스템 자원이 부족할 때 NSPurgeable Data 대상을 저장한 메모리를 방출할 수 있다.
  • BeginContentAccess를 호출하면 현재 NSPurgeable Data가 차지하는 메모리를 버려서는 안 된다는 것을 알 수 있습니다.
  • endContentAccess를 호출하면 필요할 때 NSPurgeable Data가 차지하는 메모리를 버릴 수 있습니다.
  • beginContentAccess는 endContentAccess와 유사한 인용계수로 대상의 인용계수가 0이어야 버려질 수 있다.
  • 캐시를 적절하게 사용하면 응용 프로그램의 응답 속도가 향상될 수 있다.'계산하기 어려운'데이터만 캐시에 넣을 수 있다. 예를 들어 네트워크에서 얻거나 디스크에서 읽어야 하는 데이터들이다.
  • #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
    

    요점
  • 캐시를 구현할 때는 NSDictionary 객체가 아닌 NSCache를 선택해야 합니다.NSCache는 우아한 자동 삭제 기능을 제공할 수 있을 뿐만 아니라, '라인 안전' 이며, 사전과 달리 키를 복사하지 않기 때문이다.
  • NSCache 대상에 상한선을 설정하여 캐시에 있는 대상의 총 개수와'총 원가'를 제한할 수 있다. 이러한 척도는 캐시가 그 중의 대상을 삭제할 시기를 정의한다.그러나 이 잣대를 믿을 만한 '하드 제한' 으로 여기지 마라. NSCache에 대해서만 숙제를 안다.
  • NSPurgeable Data를 NSCache와 함께 사용하면 자동으로 데이터를 지우는 기능을 실현할 수 있다. 즉, NSPurgeable Data 대상이 차지하는 메모리가 시스템에 의해 버려질 때 그 대상 자체도 캐시에서 제거된다.
  • 캐시를 적절하게 사용하면 응용 프로그램의 응답 속도가 향상됩니다.네트워크에서 가져오거나 디스크에서 읽을 수 있는 데이터 같은 '다시 계산하기 힘든' 데이터만 캐시에 넣을 수 있다.
  • 좋은 웹페이지 즐겨찾기