gpt4 book ai didi

ios - 当应用程序进入后台状态时,NSCache会删除其所有数据

转载 作者:行者123 更新时间:2023-12-01 15:30:36 24 4
gpt4 key购买 nike

我正在使用NSCache,正在使用NSCache来存储图像。我正在UITableView上显示图像。每当我添加图像时,首先将它们调整大小,然后添加到表中,然后添加到NSCache中。一切正常。

但是,当我关闭应用程序并再次打开它时,只要应用程序进入后台运行,“我的缓存”将是空的,并且我的应用程序会再次调整图像的大小,然后显示它,因为起初我会看到一个空表。

我不明白为什么会这样。这是NSCache的预期行为吗?如果是,那么我们如何才能改善用户体验,以使使用不会出现滞后现象。

这是@ipmcc向我建议的代码

类别是我的实体名称(我正在使用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不应该丢弃您的数据。

这是解决此问题的方法。

class ImageCache: NSObject , NSDiscardableContent {

public var image: UIImage!

func beginContentAccess() -> Bool {
return true
}

func endContentAccess() {

}

func discardContentIfPossible() {

}

func isContentDiscarded() -> Bool {
return false
}
}

然后像这样在 NSCache中使用此类。
let cache = NSCache<NSString, ImageCache>()

然后像这样设置缓存中的数据
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
}

关于ios - 当应用程序进入后台状态时,NSCache会删除其所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20606161/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com