Может ли кто-нибудь привести пример использования NSCache
для кэширования строки?
Или у кого есть ссылка на хорошее объяснение? Кажется, я не могу найти..
Как использовать NSCache
Ответ 1
Вы используете его так же, как вы бы использовали 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 there.
Widget *myWidget = [myCache objectForKey: @"Important Widget"];
if (!myWidget) {
// It 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 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];
}
Ответ 2
@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"];
Ответ 3
Пример кода для кэширования строки с использованием 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 для всего приложения (singleton), вы можете легко расширить 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"
Ответ 4
образец проекта Добавьте файлы CacheController.h и .m из образца проекта в ваш проект. В классе, где вы хотите кэшировать данные, введите код ниже.
[[CacheController storeInstance] setCache:@"object" forKey:@"objectforkey" ];
вы можете установить любой объект, используя этот
[[CacheController storeInstance] getCacheForKey:@"objectforkey" ];
для извлечения
Важно: класс NSCache включает различные политики автоматического удаления. если вы хотите, чтобы кэш-данные были постоянными или вы хотите удалить кешированные данные за определенное время см. этот ответ.
Ответ 5
Не должны ли кэшированные объекты реализовывать протокол NSDiscardableContent?
Из ссылки на класс NSCache: Обычный тип данных, хранящийся в объектах NSCache, является объектом, который реализует протокол NSDiscardableContent. Сохранение этого типа объекта в кеше имеет преимущества, потому что его содержимое можно отбросить, когда оно больше не понадобится, тем самым экономя память. По умолчанию объекты NSDiscardableContent в кеше автоматически удаляются из кеша, если их содержимое отбрасывается, хотя эта политика автоматического удаления может быть изменена. Если объект NSDiscardableContent помещается в кеш, кеш вызывает discardContentIfPossible на нем при его удалении.