Quelqu'un peut-il donner un exemple sur la façon d'utiliser NSCache
pour mettre en cache une chaîne? Ou quelqu'un a un lien vers une bonne explication? Je n'arrive pas à en trouver ...
Quelqu'un peut-il donner un exemple sur la façon d'utiliser NSCache
pour mettre en cache une chaîne? Ou quelqu'un a un lien vers une bonne explication? Je n'arrive pas à en trouver ...
Réponses:
Vous l'utilisez de la même manière que vous l'utiliseriez NSMutableDictionary
. La différence est que lorsque NSCache
détecte une pression mémoire excessive (c'est-à-dire qu'il met en cache trop de valeurs), il libère certaines de ces valeurs pour faire de la place.
Si vous pouvez recréer ces valeurs au moment de l'exécution (en les téléchargeant sur Internet, en effectuant des calculs, peu importe), cela NSCache
peut répondre à vos besoins. Si les données ne peuvent pas être recréées (par exemple, elles sont entrées par l'utilisateur, elles sont sensibles au temps, etc.), vous ne devez pas les stocker dans un NSCache
car elles y seront détruites.
Exemple, sans prise en compte de la sécurité des threads:
// 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
objet n'est pas désalloué, alors oui, il restera en mémoire. Cependant, son contenu peut encore être abattu.
@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"];
Exemple de code pour la mise en cache d'une chaîne à l'aide de NSCache dans 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"
Pour créer une seule instance de NSCache à l'échelle de l'application (un singleton), vous pouvez facilement étendre NSCache pour ajouter une propriété sharedInstance. Mettez simplement le code suivant dans un fichier appelé quelque chose comme NSCache + Singleton.swift:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
Vous pouvez ensuite utiliser le cache n'importe où dans l'application:
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() } }
exemple de projet Ajoutez le fichier CacheController.h et .m de l'exemple de projet à votre projet. Dans la classe où vous souhaitez mettre en cache les données, mettez le code ci-dessous.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
vous pouvez définir n'importe quel objet en utilisant ceci
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
récupérer
Important: la classe NSCache incorpore diverses stratégies de suppression automatique. si vous souhaitez mettre en cache les données de manière permanente ou si vous souhaitez supprimer les données mises en cache à un moment donné, consultez cette réponse .
Les objets mis en cache ne devraient-ils pas implémenter le protocole NSDiscardableContent?
À partir de la référence de classe NSCache: Un type de données commun stocké dans les objets NSCache est un objet qui implémente le protocole NSDiscardableContent. Le stockage de ce type d'objet dans un cache présente des avantages, car son contenu peut être supprimé lorsqu'il n'est plus nécessaire, économisant ainsi de la mémoire. Par défaut, les objets NSDiscardableContent dans le cache sont automatiquement supprimés du cache si leur contenu est ignoré, bien que cette stratégie de suppression automatique puisse être modifiée. Si un objet NSDiscardableContent est placé dans le cache, le cache appelle discardContentIfPossible sur celui-ci lors de sa suppression.