Kann jemand ein Beispiel geben, wie man NSCache
einen String zwischenspeichert? Oder hat jemand einen Link zu einer guten Erklärung? Ich kann anscheinend keine finden ..
Kann jemand ein Beispiel geben, wie man NSCache
einen String zwischenspeichert? Oder hat jemand einen Link zu einer guten Erklärung? Ich kann anscheinend keine finden ..
Antworten:
Sie verwenden es genauso, wie Sie es verwenden würden NSMutableDictionary
. Der Unterschied besteht darin, dass beim NSCache
Erkennen eines übermäßigen Speicherdrucks (dh beim Zwischenspeichern zu vieler Werte) einige dieser Werte freigegeben werden, um Platz zu schaffen.
Wenn Sie diese Werte zur Laufzeit neu erstellen können (durch Herunterladen aus dem Internet, durch Ausführen von Berechnungen usw.), entspricht dies NSCache
möglicherweise Ihren Anforderungen. Wenn die Daten nicht neu erstellt werden können (z. B. Benutzereingaben, zeitkritische Daten usw.), sollten Sie sie nicht in einer Datei speichernNSCache
da sie dort zerstört werden.
Beispiel, ohne Berücksichtigung der Thread-Sicherheit:
// 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
Objekt nicht freigegeben wird, bleibt es im Speicher. Der Inhalt kann jedoch weiterhin ausgesondert werden.
@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"];
Beispielcode zum Zwischenspeichern einer Zeichenfolge mit NSCache in 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"
Um eine einzelne app-weite Instanz von NSCache (ein Singleton) zu erstellen, können Sie NSCache problemlos erweitern, um eine sharedInstance-Eigenschaft hinzuzufügen. Fügen Sie einfach den folgenden Code in eine Datei mit dem Namen NSCache + Singleton.swift ein:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
Sie können den Cache dann an einer beliebigen Stelle in der App verwenden:
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() } }
Beispielprojekt Fügen Sie Ihrem Projekt die Dateien CacheController.h und .m aus dem Beispielprojekt hinzu. Geben Sie in der Klasse, in der Sie Daten zwischenspeichern möchten, den folgenden Code ein.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
Sie können damit jedes Objekt festlegen
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
abrufen
Wichtig: Die NSCache-Klasse enthält verschiedene Richtlinien zum automatischen Entfernen. Wenn Sie die Daten für eine dauerhafte Speicherung zwischenspeichern oder zwischengespeicherte Daten zu einem bestimmten Zeitpunkt entfernen möchten, lesen Sie diese Antwort .
Sollten die zwischengespeicherten Objekte nicht das NSDiscardableContent-Protokoll implementieren?
Aus der NSCache-Klassenreferenz: Ein allgemeiner Datentyp, der in NSCache-Objekten gespeichert ist, ist ein Objekt, das das NSDiscardableContent-Protokoll implementiert. Das Speichern dieses Objekttyps in einem Cache hat Vorteile, da sein Inhalt verworfen werden kann, wenn er nicht mehr benötigt wird, wodurch Speicherplatz gespart wird. Standardmäßig werden NSDiscardableContent-Objekte im Cache automatisch aus dem Cache entfernt, wenn ihr Inhalt verworfen wird. Diese Richtlinie zum automatischen Entfernen kann jedoch geändert werden. Wenn ein NSDiscardableContent-Objekt in den Cache gestellt wird, ruft der Cache beim Entfernen discardContentIfPossible auf.