避免图像解压缩阻塞主线程

时间:2013-03-24 13:07:29

标签: iphone ios objective-c javax.imageio

我有一些代码可以使用UIImageView显示动画GIF图像,在这里:https://github.com/amleszk/GifBlocking

虽然某种类型的GIF图片存在问题,但99%的情况效果很好,例如:http://i.imgur.com/mbImw.gif

这个gif接收101张图像,然后在显示包含动画图像的UIImageView时阻止主线程。如果它有压缩,它可以解压缩gif,但是我怎么能阻止它阻塞主线程呢?

在主线程上调用的方法是 DGifDecompressInput DGifDecompressLine copyImageBlockSetGIF

问题是当视图被添加到层次结构时会发生gif解压缩 - 这应该在主线程上完成

由于

3 个答案:

答案 0 :(得分:6)

grasGendarme的代码很有用,但请注意UIImage是懒惰的,在真正需要之前不会对图像进行解码。关键是你必须使用CGContextDrawImage在后​​台线程上强制解压缩。因此,使用UIImage+JTImageDecode.h在后台创建一个未压缩的图像版本,然后将其设置回主线程。

答案 1 :(得分:2)

很高兴看到实际的代码。没有它,我们的帮助是有限的。

也许你可以放一条线:

[self performSelectorInBackground:@selector(yourBlockingMethod:) withObject:yourObject];

或者修改你的库以在后台线程上解压缩GIF,然后在主线程上使用setNeedsDisplay

答案 2 :(得分:2)

您可以使用Grand Central Dispatch和串行队列在一个单独的线程上完成所有操作:

// create the queue that will process your data:
dispatch_queue_t dataProcessQueue = dispatch_queue_create("data process queue", NULL); // the name is there for debugging purposes
    //dispatch to the newly created queue, and do not wait for it to complete
    dispatch_async(dataProcessQueue, ^{
        // load and decode gif
        // ...
        dispatch_async(dispatch_get_main_queue(), ^{
            // put gif in place (UI work always happen on the main queue)
            // ...
    });
});