7

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

1 に答える 1