Czy ktoś może podać przykład, jak używać NSCache
do buforowania ciągu? Czy ktoś ma link do dobrego wyjaśnienia? Nie mogę znaleźć żadnego ...
Czy ktoś może podać przykład, jak używać NSCache
do buforowania ciągu? Czy ktoś ma link do dobrego wyjaśnienia? Nie mogę znaleźć żadnego ...
Odpowiedzi:
Używasz go w taki sam sposób, jak byś używał NSMutableDictionary
. Różnica polega na tym, że gdy NSCache
wykryje nadmierne obciążenie pamięci (tj. Buforuje zbyt wiele wartości), zwolni niektóre z tych wartości, aby zrobić miejsce.
Jeśli możesz odtworzyć te wartości w czasie wykonywania (pobierając je z Internetu, wykonując obliczenia, cokolwiek), NSCache
może to odpowiadać Twoim potrzebom. Jeśli danych nie można odtworzyć (np. Są to dane wprowadzone przez użytkownika, są wrażliwe na czas itp.), Nie należy ich przechowywać w pliku, NSCache
ponieważ zostaną tam zniszczone.
Przykład bez uwzględnienia bezpieczeństwa wątków:
// 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];
}
applicationDidEnterBackground
)
NSCache
obiekt nie zostanie zwolniony, to tak, pozostanie w pamięci. Jednak jego zawartość może nadal podlegać ubojowi.
@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"];
Przykładowy kod do buforowania ciągu przy użyciu NSCache w języku Swift:
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"
Aby utworzyć pojedyncze wystąpienie NSCache dla całej aplikacji (singleton), możesz łatwo rozszerzyć NSCache, aby dodać właściwość sharedInstance. Po prostu umieść następujący kod w pliku o nazwie podobnej do NSCache + Singleton.swift:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
Następnie możesz użyć pamięci podręcznej w dowolnym miejscu aplikacji:
NSCache.sharedInstance.setObject("String for key 2", forKey: "Key2")
var result2 = NSCache.sharedInstance.objectForKey("Key2") as String
println(result2) // Prints "String for key 2"
class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
przykładowy projekt Dodaj plik CacheController.h i .m z przykładowego projektu do projektu. W klasie, w której chcesz przechowywać dane w pamięci podręcznej, umieść poniższy kod.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
możesz ustawić dowolny obiekt za pomocą tego
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
odzyskać
Ważne: Klasa NSCache zawiera różne zasady automatycznego usuwania. jeśli chcesz buforować dane na stałe lub chcesz usunąć dane z pamięci podręcznej w określonym czasie, zobacz tę odpowiedź .
Czy buforowane obiekty nie powinny implementować protokołu NSDiscardableContent?
Z opisu klasy NSCache: Typowym typem danych przechowywanym w obiektach NSCache jest obiekt implementujący protokół NSDiscardableContent. Przechowywanie tego typu obiektu w pamięci podręcznej ma zalety, ponieważ jego zawartość można wyrzucić, gdy nie jest już potrzebna, oszczędzając w ten sposób pamięć. Domyślnie obiekty NSDiscardableContent w pamięci podręcznej są automatycznie usuwane z pamięci podręcznej, jeśli ich zawartość zostanie odrzucona, chociaż tę zasadę automatycznego usuwania można zmienić. Jeśli obiekt NSDiscardableContent zostanie umieszczony w pamięci podręcznej, pamięć podręczna wywoła na nim discardContentIfPossible po jego usunięciu.