web-dev-qa-db-fra.com

Comment utiliser NSCache

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.

120
Thys

Vous l'utilisez de la même manière que vous utiliseriez NSMutableDictionary. La différence est que lorsque NSCache détecte une pression excessive de la mémoire (c'est-à-dire qu'il met en cache trop de valeurs), certaines de ces valeurs seront libérées pour libérer de l'espace.

Si vous pouvez recréer ces valeurs au moment de l'exécution (en téléchargeant sur Internet, en effectuant des calculs, peu importe), alors NSCache pourra répondre à vos besoins. Si les données ne peuvent pas être recréées (par exemple, il s'agit d'une entrée utilisateur, elle est sensible au temps, etc.), vous ne devriez pas la stocker dans un NSCache car elle y sera détruite.

Exemple, ne tenant pas 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];
}
133
Jonathan Grynspan
@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"];
19
Gabriel.Massana

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 à l'ajout d'une propriété sharedInstance. Il suffit de placer 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"
8
PointZeroTwo

Projet exemple Ajoutez le fichier CacheController.h et le fichier .m du projet exemple à votre projet. Dans la classe où vous voulez mettre les données en cache, mettez le code ci-dessous.

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

vous pouvez définir n'importe quel objet en utilisant cette

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

reculer

Important: La classe NSCache intègre diverses stratégies de suppression automatique. si vous voulez mettre les données en cache de manière permanente ou si vous voulez supprimer les données en cache à un moment donné voir cette réponse .

6
Ajumal

Les objets mis en cache ne doivent-ils pas implémenter le protocole NSDiscardableContent?

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. Stocker ce type d'objet dans un cache présente des avantages, car son contenu peut être supprimé lorsqu'il n'est plus utilisé, ce qui permet d'économiser de la mémoire. Par défaut, les objets NSDiscardableContent du cache sont automatiquement supprimés du cache si leur contenu est supprimé, bien que cette stratégie de suppression automatique puisse être modifiée. Si un objet NSDiscardableContent est placé dans le cache, le cache y appelle discardContentIfPossible lors de sa suppression.

1
Phoenix