3

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

它适用于 99% 的情况,尽管某些类型的 GIF 图像存在问题,可以在此处找到示例:http: //i.imgur.com/mbImw.gif

这个 gif 很好地接收了 101 个图像,然后在显示包含动画图像的 UIImageView 时阻塞了主线程。如果它有压缩,它可以解压缩 gif,但是我将如何阻止它阻塞主线程?

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

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

谢谢

4

3 回答 3

6

grasGendarme 的代码很有用,但请注意 UIImage 是惰性的,在真正需要之前不会解码图像。关键是您必须使用CGContextDrawImage. 所以使用UIImage+JTImageDecode.h在后台创建一个未压缩的图像版本,然后将其设置回主线程。

于 2013-03-24T18:22:41.587 回答
2

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

也许你可以写一行:

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

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

于 2013-03-24T15:37:06.247 回答
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)
            // ...
    });
});
于 2013-03-24T15:44:19.957 回答