ios objective-c xcode cocoa nscache

ios - Cómo usar NSCache



objective-c xcode (5)

¿No deberían los objetos en caché implementar el protocolo NSDiscardableContent?

De la referencia de clase NSCache: Un tipo de datos común almacenado en objetos NSCache es un objeto que implementa el protocolo NSDiscardableContent. Almacenar este tipo de objetos en una memoria caché tiene sus ventajas, ya que su contenido puede descartarse cuando ya no es necesario, lo que permite ahorrar memoria. De forma predeterminada, los objetos NSDiscardableContent en la memoria caché se eliminan automáticamente de la memoria caché si se descarta su contenido, aunque esta política de eliminación automática se puede cambiar. Si un objeto NSDiscardableContent se coloca en el caché, el caché llama a descarteContenidoIfPossible sobre él una vez eliminado.

¿Alguien puede dar un ejemplo sobre cómo usar NSCache para almacenar en caché una cadena? O alguien tiene un enlace a una buena explicación? Parece que no puedo encontrar ninguna ...


Código de ejemplo para almacenar en caché una cadena usando NSCache en 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"

Para crear una sola instancia de NSCache en toda la aplicación (un singleton), puede extender NSCache fácilmente para agregar una propiedad sharedInstance. Simplemente ponga el siguiente código en un archivo llamado algo así como NSCache + Singleton.swift:

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

Luego puede usar el caché en cualquier lugar de la aplicación:

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


Ejemplo de proyecto Agregue el archivo CacheController.h y .m desde el proyecto de ejemplo a su proyecto. En la clase en la que desea almacenar los datos en caché, coloque el siguiente código.

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

puedes configurar cualquier objeto usando esto

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

para recuperar

Importante: la clase NSCache incorpora varias políticas de eliminación automática. si desea almacenar en caché los datos para permanentes o si desea eliminar los datos almacenados en caché en un tiempo específico, consulte esta respuesta .


Lo usa de la misma manera que usaría NSMutableDictionary . La diferencia es que cuando NSCache detecta una presión de memoria excesiva (es decir, almacena en caché demasiados valores) liberará algunos de esos valores para hacer espacio.

Si puede recrear esos valores en tiempo de ejecución (descargando desde Internet, haciendo cálculos, lo que sea), entonces NSCache puede adaptarse a sus necesidades. Si no se pueden recrear los datos (por ejemplo, es la entrada del usuario, es sensible al tiempo, etc.), entonces no debe almacenarlos en una NSCache porque se destruirá allí.

Ejemplo, no tener en cuenta la seguridad de subprocesos:

// 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]; }


@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"];