Может кто-нибудь привести пример того, как использовать NSCache
для кеширования строки? Или у кого-нибудь есть ссылка на хорошее объяснение? Кажется, я не могу найти ...
Может кто-нибудь привести пример того, как использовать NSCache
для кеширования строки? Или у кого-нибудь есть ссылка на хорошее объяснение? Кажется, я не могу найти ...
Ответы:
Вы используете его так же, как и раньше NSMutableDictionary
. Разница в том, что при NSCache
обнаружении чрезмерной нагрузки на память (т. Е. Кэширование слишком большого количества значений) он освобождает некоторые из этих значений, чтобы освободить место.
Если вы можете воссоздать эти значения во время выполнения (путем загрузки из Интернета, выполнения расчетов и т. Д.), Это NSCache
может удовлетворить ваши потребности. Если данные не могут быть воссозданы (например, это пользовательский ввод, они чувствительны ко времени и т. Д.), Вы не должны хранить их в папке, NSCache
потому что они будут там уничтожены.
Пример без учета потоковой безопасности:
// 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
объект не освобожден, то да, он останется в памяти. Однако его содержимое может быть удалено.
@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"];
Пример кода для кеширования строки с использованием NSCache в 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"
Чтобы создать единый экземпляр NSCache для всего приложения (синглтон), вы можете легко расширить NSCache, добавив свойство sharedInstance. Просто поместите следующий код в файл под названием NSCache + Singleton.swift:
import Foundation
extension NSCache {
class var sharedInstance : NSCache {
struct Static {
static let instance : NSCache = NSCache()
}
return Static.instance
}
}
Затем вы можете использовать кеш в любом месте приложения:
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() } }
образец проекта Добавьте файл CacheController.h и .m из образца проекта в свой проект. В классе, в котором вы хотите кэшировать данные, поместите приведенный ниже код.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
вы можете установить любой объект с помощью этого
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
извлечь
Важно: класс NSCache включает в себя различные политики автоматического удаления. если вы хотите кэшировать данные на постоянной основе или хотите удалить кешированные данные в определенное время, см. этот ответ .
Разве кэшированные объекты не должны реализовывать протокол NSDiscardableContent?
Из справочника по классу NSCache: Общий тип данных, хранящийся в объектах NSCache, - это объект, реализующий протокол NSDiscardableContent. Хранение этого типа объекта в кэше имеет преимущества, потому что его содержимое может быть удалено, когда оно больше не нужно, тем самым экономя память. По умолчанию объекты NSDiscardableContent в кэше автоматически удаляются из кеша, если их содержимое отбрасывается, хотя эту политику автоматического удаления можно изменить. Если объект NSDiscardableContent помещается в кеш, кеш вызывает для него discardContentIfPossible после его удаления.