NSCache 사용 방법


121

누군가 NSCache문자열을 캐시 하는 데 사용하는 방법에 대한 예를 줄 수 있습니까 ? 아니면 누구든지 좋은 설명에 대한 링크가 있습니까? 찾을 수없는 것 같습니다 ..


7
엄청난 양의 Cocoa를 보았음에도 불구하고 NSCache에 대해 들어 본 적이 없습니다. 좋은 질문!
Nektarios 2011

여기에서 반복 가능한 NSCache 버전을 만들었습니다. 자유롭게 기여하십시오 : github.com/gregkrsak/GKCache
Greg M. Krsak 2013-08-21

답변:


134

사용하는 것과 같은 방식으로 사용 NSMutableDictionary합니다. 차이점은 NSCache과도한 메모리 압력이 감지 되면 (즉, 너무 많은 값을 캐싱하는) 공간을 확보하기 위해 해당 값 중 일부를 해제한다는 것입니다.

인터넷에서 다운로드하거나 계산을 수행하여 런타임에 이러한 값을 다시 만들 수 있다면 NSCache필요에 맞을 수 있습니다. 데이터를 다시 만들 수없는 경우 (예 : 사용자 입력, 시간에 민감한 등) 데이터 NSCache가 파괴되므로에 저장해서는 안됩니다 .

예, 스레드 안전성을 고려하지 않음 :

// Your cache should have a lifetime beyond the method or handful of methods
// that use it. For example, you could make it a field of your application
// delegate, or of your view controller, or something like that. Up to you.
NSCache *myCache = ...;
NSAssert(myCache != nil, @"cache object is missing");

// Try to get the existing object out of the cache, if it's there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
    // It's not in the cache yet, or has been removed. We have to
    // create it. Presumably, creation is an expensive operation,
    // which is why we cache the results. If creation is cheap, we
    // probably don't need to bother caching it. That's a design
    // decision you'll have to make yourself.
    myWidget = [[[Widget alloc] initExpensively] autorelease];

    // Put it in the cache. It will stay there as long as the OS
    // has room for it. It may be removed at any time, however,
    // at which point we'll have to create it again on next use.
    [myCache setObject: myWidget forKey: @"Important Widget"];
}

// myWidget should exist now either way. Use it here.
if (myWidget) {
    [myWidget runOrWhatever];
}

1
NSCache 개체를 인스턴스화하는 방법은 무엇입니까? 앱을 실행할 때마다 캐시 된 모든 정보를 잃어버린 것 같습니다. 나는 사용한다; [NSCache ALLOC] INIT]
Thizzer

17
디스크의 영구 캐시가 아닙니다. 메모리에만 있으므로 앱 실행이 중지 될 때마다 삭제됩니다.
Jonathan Grynspan 2011

애플리케이션이 backgruond에 진입 한 후이 캐시가 유지됩니까? (즉, 이후 applicationDidEnterBackground)
barfoon dec.

응용 프로그램이 종료되지 않고 NSCache개체가 할당 해제되지 않은 경우 예, 메모리에 남아 있습니다. 그러나 그 내용은 여전히 ​​컬링 될 수 있습니다.
Jonathan Grynspan 2011

3
아니요. 주장은 어떤 것이 사실이라고 주장합니다. 즉, 그 안에있는 진술이 사실 일 것으로 예상됩니다. 우리는 객체 할당 및 / 또는 생성이 성공적이라고 주장합니다.
Jonathan Grynspan 2012 년

19
@implementation ViewController
{    
    NSCache *imagesCache;    
}


- (void)viewDidLoad
{    
    imagesCache = [[NSCache alloc] init];
}


// How to save and retrieve NSData into NSCache
NSData *imageData = [imagesCache objectForKey:@"KEY"];
[imagesCache setObject:imageData forKey:@"KEY"];

3
예. 저장 : [imagesDictionary setObject : imageData forKey : @ "KEY"]; 검색 : NSData * imageData = [imagesCache objectForKey : @ "KEY"];
Gabriel.Massana 2013-04-17

2
데이터를 chache에 저장합니다. [imagesCache setObject : imageData forKey : @ "KEY"];
kas-kad 2013

1
방금 변경된 게시물을 편집했습니다 : imagesCache에 대한 imagesDictionary. Thx
Gabriel.Massana 2013

동등한 신속한 예?
Jasper

9

Swift에서 NSCache를 사용하여 문자열을 캐싱하기위한 샘플 코드 :

var cache = NSCache()
cache.setObject("String for key 1", forKey: "Key1")
var result = cache.objectForKey("Key1") as String
println(result) // Prints "String for key 1"

앱 전체에서 NSCache의 단일 인스턴스 (싱글 톤)를 생성하려면 NSCache를 쉽게 확장하여 sharedInstance 속성을 추가 할 수 있습니다. NSCache + Singleton.swift와 같은 파일에 다음 코드를 넣으십시오.

import Foundation

extension NSCache {
    class var sharedInstance : NSCache {
        struct Static {
            static let instance : NSCache = NSCache()
        }
        return Static.instance
    }
}

그런 다음 앱의 어느 곳에서나 캐시를 사용할 수 있습니다.

NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"

3
신속한 3에서 이것을 구현하는 방법을 알고 있습니까?
Andy

3
작동합니다. class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
AmitaiB

6

샘플 프로젝트 샘플 프로젝트의 CacheController.h 및 .m 파일을 프로젝트에 추가합니다. 데이터를 캐시하려는 클래스에 아래 코드를 넣으십시오.

[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];

이것을 사용하여 모든 개체를 설정할 수 있습니다

[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];

검색하다

중요 : NSCache 클래스는 다양한 자동 제거 정책을 통합합니다. 영구적으로 데이터를 캐시하거나 특정 시간에 캐시 된 데이터를 제거 하려면이 답변을 참조하십시오 .


1

캐시 된 개체가 NSDiscardableContent 프로토콜을 구현해야하지 않습니까?

NSCache 클래스 참조에서 : NSCache 개체에 저장된 공통 데이터 유형은 NSDiscardableContent 프로토콜을 구현하는 개체입니다. 이러한 유형의 개체를 캐시에 저장하면 더 이상 필요하지 않을 때 해당 콘텐츠를 폐기하여 메모리를 절약 할 수 있기 때문에 이점이 있습니다. 기본적으로 캐시의 NSDiscardableContent 개체는 해당 콘텐츠가 삭제되면 캐시에서 자동으로 제거되지만이 자동 제거 정책은 변경할 수 있습니다. NSDiscardableContent 개체를 캐시에 넣으면 캐시는 제거시 해당 개체에 대해 ignoreContentIfPossible을 호출합니다.


1
NSDiscardableContent 프로토콜을 구현할 수 있지만 필수는 아닙니다. NSDiscardableContent는 더 이상 참조가 없을 때 항상 NSCache에서 제거되는 것처럼 보입니다. NSDiscardableContent 개체 이외의 개체는 '메모리가 부족'하고 NSCache가 지워질 때까지 NSCache에 저장됩니다.
Thizzer 2015-06-15
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.