NSCache
Bir 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 ..
NSCache
Bir 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 ..
Yanıtlar:
Aynı şekilde kullanırsın NSMutableDictionary
. Aradaki fark, NSCache
aşı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) NSCache
ihtiyaçlarınızı karşılayabilir. Veriler yeniden oluşturulamıyorsa (örneğin, kullanıcı girdisi, zamana duyarlı, vb.), O zaman NSCache
orada 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];
}
applicationDidEnterBackground
)
NSCache
nesne serbest bırakılmazsa, evet, bellekte kalacaktır. Ancak içeriği yine de itlaf işlemine tabi olabilir.
@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"];
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"
class Cache: NSCache<AnyObject, AnyObject> { static let shared = NSCache<AnyObject, AnyObject>() private override init() { super.init() } }
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 .
Ö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.