我有一些代码可以使用UIImageView显示动画GIF图像,在这里:https://github.com/amleszk/GifBlocking
虽然某种类型的GIF图片存在问题,但99%的情况效果很好,例如:http://i.imgur.com/mbImw.gif
这个gif接收101张图像,然后在显示包含动画图像的UIImageView时阻止主线程。如果它有压缩,它可以解压缩gif,但是我怎么能阻止它阻塞主线程呢?
在主线程上调用的方法是
DGifDecompressInput
DGifDecompressLine
copyImageBlockSetGIF
问题是当视图被添加到层次结构时会发生gif解压缩 - 这应该在主线程上完成
由于
答案 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)
// ...
});
});