Как использовать NSCache - PullRequest
       19

Как использовать NSCache

120 голосов
/ 22 апреля 2011

Может ли кто-нибудь привести пример использования NSCache для кэширования строки?Или у кого-нибудь есть ссылка на хорошее объяснение?Я не могу найти ни одного ..

Ответы [ 5 ]

133 голосов
/ 22 апреля 2011

Вы используете его так же, как и 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];
}
19 голосов
/ 18 октября 2012
@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"];
9 голосов
/ 02 января 2015

Пример кода для кэширования строки с использованием 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"
6 голосов
/ 06 марта 2013

пример проекта Добавьте файл CacheController.h и .m из примера проекта в свой проект. В классе, где вы хотите кэшировать данные, поместите следующий код.

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

Вы можете установить любой объект, используя

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

чтобы получить

Важное замечание: Класс NSCache включает в себя различные политики автоматического удаления. если вы хотите кэшировать данные для постоянного или вы хотите удалить кэшированные данные в определенное время см. этот ответ .

1 голос
/ 12 июня 2015

Разве кэшированные объекты не должны реализовывать протокол NSDiscardableContent?

Из ссылки на класс NSCache: общий тип данных, хранящийся в объектах NSCache, является объектом, реализующим протокол NSDiscardableContent.Хранение этого типа объекта в кеше имеет свои преимущества, поскольку его содержимое может быть отброшено, когда оно больше не нужно, что экономит память.По умолчанию объекты NSDiscardableContent в кэше автоматически удаляются из кэша, если их содержимое отбрасывается, хотя эту политику автоматического удаления можно изменить.Если объект NSDiscardableContent помещен в кеш, кеш вызывает на нем discardContentIfPossible после его удаления.

...