NSCache nasıl kullanılır


121

NSCacheBir dizeyi önbelleğe almak için nasıl kullanılacağına dair bir örnek verebilir misiniz? Ya da iyi bir açıklamanın bağlantısı olan var mı? Sanki bulamıyorum ..


7
Çok miktarda Kakao görmesine rağmen NSCache'yi hiç duymadım. İyi soru!
Nektarios

Burada NSCache'nin yinelenebilir bir sürümünü oluşturdum. Katkıda bulunmaktan çekinmeyin: github.com/gregkrsak/GKCache
Greg M. Krsak

Yanıtlar:


134

Aynı şekilde kullanırsın NSMutableDictionary. Aradaki fark, NSCacheaşırı bellek baskısı algıladığında (yani, çok fazla değeri önbelleğe alıyor), yer açmak için bu değerlerin bazılarını serbest bırakmasıdır.

Bu değerleri çalışma zamanında yeniden oluşturabiliyorsanız (İnternetten indirerek, hesaplamalar yaparak, her neyse) NSCacheihtiyaçlarınızı karşılayabilir. Veriler yeniden oluşturulamıyorsa (örneğin, kullanıcı girdisi, zamana duyarlı, vb.), O zaman NSCacheorada saklamamalısınız çünkü orada yok edilecektir.

İplik güvenliğini hesaba katmayan örnek:

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

1
NSCache nesnesi nasıl başlatılır? Uygulamayı her çalıştırdığımda önbelleğe alınmış tüm bilgileri kaybediyor gibiyim. Kullanırım; [[NSCache ayırma] init]
Thizzer

17
Diskte kalıcı bir önbellek değil. Yalnızca bellekte olduğundan, evet, uygulamanızın çalışmayı her durdurduğunda yok edilir.
Jonathan Grynspan

Uygulama arka plana girdikten sonra bu önbellek korunur mu? (yani sonra applicationDidEnterBackground)
barfoon

Uygulama sonlandırılmazsa ve NSCachenesne serbest bırakılmazsa, evet, bellekte kalacaktır. Ancak içeriği yine de itlaf işlemine tabi olabilir.
Jonathan Grynspan

3
Hayır. Bir iddia, bir şeyin doğru olduğunu, yani içindeki ifadenin doğru olmasının beklendiğini iddia eder. Nesne atamanın ve / veya yaratmanın başarılı olduğunu iddia ediyoruz.
Jonathan Grynspan

19
@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
Evet. Kaydet: [imagesDictionary setObject: imageData forKey: @ "KEY"]; geri alma: NSData * imageData = [imagesCache objectForKey: @ "KEY"];
Gabriel.Massana

2
verileri chache'ye kaydet: [imagesCache setObject: imageData forKey: @ "KEY"];
kas-kad

1
Gönderiyi değiştirdim: imagesCache için imagesDictionary. Thx
Gabriel.Massana

Eşdeğer hızlı bir örnek mi?
Jasper

9

Swift'de NSCache kullanarak bir dizeyi önbelleğe almak için örnek kod:

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'nin uygulama çapında tek bir örneğini (bir tekli) oluşturmak için, bir sharedInstance özelliği eklemek için NSCache'yi kolayca genişletebilirsiniz. Aşağıdaki kodu NSCache + Singleton.swift gibi bir dosyaya koyun:

import Foundation

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

Önbelleği daha sonra uygulamanın herhangi bir yerinde kullanabilirsiniz:

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

3
bunu hızlı 3'te nasıl uygulayacağınızı biliyor musunuz?
Andy

3
Bu çalışmalıdır: class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
AmitaiB

6

sample Project Örnek projeden CacheController.h ve .m dosyasını projenize ekleyin. Verileri önbelleğe almak istediğiniz sınıfta aşağıdaki kodu girin.

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

bunu kullanarak herhangi bir nesneyi ayarlayabilirsiniz

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

geri çekilmek

Önemli: NSCache sınıfı, çeşitli otomatik kaldırma politikaları içerir. Verileri kalıcı olarak önbelleğe almak istiyorsanız veya önbelleğe alınmış verileri belirli bir zamanda kaldırmak istiyorsanız, bu yanıtı görün .


1

Önbelleğe alınan nesnelerin NSDiscardableContent protokolünü uygulaması gerekmez mi?

NSCache sınıfı referansından: NSCache nesnelerinde depolanan yaygın bir veri türü, NSDiscardableContent protokolünü uygulayan bir nesnedir. Bu tür bir nesneyi bir önbellekte saklamanın faydaları vardır, çünkü içeriği artık ihtiyaç duyulmadığında atılabilir ve böylece bellek tasarrufu sağlanır. Varsayılan olarak, önbellekteki NSDiscardableContent nesneleri, içerikleri atılırsa önbellekten otomatik olarak kaldırılır, ancak bu otomatik kaldırma politikası değiştirilebilir. Bir NSDiscardableContent nesnesi önbelleğe yerleştirilirse, önbellek kaldırıldıktan sonra üzerinde discardContentIfPossible çağırır.


1
NSDiscardableContent protokolünü uygulayabilirsiniz, ancak bu gerekli değildir. Görünüşe göre NSDiscardableContent, daha fazla referans olmadığında NSCache'den her zaman kaldırılır. NSDiscardableContent nesnesi dışındaki nesneler, NSCache'de 'bellek sıkı' olana ve NSCache temizlenene kadar saklanır.
Thizzer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.