问题描述
我正在使用NSCache
,正在使用NSCache
存储图像.我正在UITableView
上显示图像.每当我添加图像时,首先将它们调整大小,然后再添加到表中,然后再添加到NSCache
中.一切正常.
I am working with NSCache
, I am using NSCache
to store images. I am showing images on UITableView
. Whenever I add images first they are resized and then added to the table and then to NSCache
. eveything works fine.
但是,当我关闭应用程序并再次打开它时,只要应用程序进入后台运行,我的缓存就会为空,并且我的应用程序会再次调整图像的大小,然后显示它,因为起初我会看到一个空表.
But whenever app goes to background when I close the app and open again, My Cache will be empty and again my app resizes images and then show it, because of which at first I see a empty table.
我不明白为什么会这样.这是NSCache
的预期行为吗?如果是,那么我们如何才能改善用户体验,以使使用不会出现滞后现象.
I am not understanding why this is happening. Is this the intended behaviour of NSCache
? .If yes then how can we improve the user experience so that use doesnt see the lag.
这是@ipmcc向我建议的代码
here is my code which was suggested to me by @ipmcc
这里的类别是我的实体名称(我正在使用coreData)
Here category is my entity name (I am using coreData)
// A shared (i.e. global, but scoped to this function) cache
static NSCache* imageCache = nil;
// The following initializes the cache once, and only once
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
imageCache = [[NSCache alloc] init];
});
// Generate a cache key sufficient to uniquely identify the image we're looking for
NSString* cacheKey = [NSString stringWithFormat: @"%@", category.name];
// Try fetching any existing image for that key from the cache.
UIImage* img = [imageCache objectForKey: cacheKey];
self.imageView.image = img;
// If we don't find a pre-existing one, create one
if (!img)
{
// Your original code for creating a resized image...
UIImage *image1 = [UIImage imageWithData:category.noteImage];
CGSize newSize;
if(image1.size.width == 1080 && image1.size.height == 400)
{
newSize = CGSizeMake(300, 111);
}
dispatch_async(dispatch_get_global_queue(0,0), ^{
UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
[image1 drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
dispatch_async(dispatch_get_main_queue(), ^{
// Now add the newly-created image to the cache
[imageCache setObject: newImage forKey: cacheKey];
self.imageView.image = newImage;
});
});
}
推荐答案
是的,由于某种原因,即使没有内存压力,当应用程序进入后台时,它也会立即从缓存中删除数据.要解决此问题,您必须告诉NSCache
不应丢弃您的数据.
Yes it does that, for some reason it instantly removes data from cache when app enters background even if there is no memory pressure. To fix this you have to tell NSCache
that your data should not be discarded.
这是解决此问题的方法.
Here is how you fix this.
class ImageCache: NSObject , NSDiscardableContent {
public var image: UIImage!
func beginContentAccess() -> Bool {
return true
}
func endContentAccess() {
}
func discardContentIfPossible() {
}
func isContentDiscarded() -> Bool {
return false
}
}
,然后像这样在NSCache
中使用此类.
and then use this class in NSCache
like this.
let cache = NSCache<NSString, ImageCache>()
然后像这样设置缓存中的数据
and then set the data in cache like this
let cacheImage = ImageCache()
cacheImage.image = imageDownloaded
self.cache.setObject(cacheImage, forKey: "somekey" as NSString)
并获取数据
if let cachedVersion = cache.object(forKey: "somekey") {
youImageView.image = cachedVersion.image
}
这篇关于当应用程序进入后台状态时,NSCache会删除其所有数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!