0

バックグラウンドスレッドでNSDataからUIImageをフェッチするためのコードを実行するテーブルビューがあり、フォアグラウンドでそれが呼び出されます[button setImage:image forState:UIControlStateNormal];

問題は、UIが完了するまで、その行でUIが一瞬フリーズすることです。これは、UIが画像として設定されている間、UIがフリーズすることを意味します。ユーザーがスクロールしているため、これは非常に目立ち、ぎくしゃくします。UIがこのようにフリーズするのを防ぐ方法はありますか?

dispatch_queue_t cellSetupQueue = dispatch_queue_create("Setup", NULL);
dispatch_async(cellSetupQueue, ^{
    UIImage *image = [self.mediaDelegate largeThumbnailForMediaAtIndex:indexPath.row];
    dispatch_async(dispatch_get_main_queue(), ^{     
        [self.thumbnailButton setImage:image forState:UIControlStateNormal];
    });
});

dispatch_release(cellSetupQueue);
4

1 に答える 1

3

あなたの画像はJPGだと思います。その場合、UIImageは、実際にそれらのピクセルを初めて必要とするまで、実際の画像のデコードを延期します。これをより正確に制御するには、ImageIOフレームワークを確認してください。これが私が使用するスニペットです:

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL); // data is your image file NSData
if (source)
{
    NSDictionary *dict = @{ (__bridge NSString *)kCGImageSourceShouldCache : @(YES) };
    CGImageRef cgImage = CGImageSourceCreateImageAtIndex(source, 0, (__bridge CFDictionaryRef)dict);
    if (cgImage)
    {
        CFRelease(source);
        return cgImage; // you can keep this reference so you dont have to decode again later
    }
}

重要な部分はkCGImageSourceShouldCacheオプションです。このコードをバックグラウンドスレッドで実行し、デコードされた画像をUIスレッドに渡すことができます。

于 2012-10-24T00:40:19.380 に答える