私は画像を保存するため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;
});
});
}