我正在尝试使用uiimage-from-animated-gif将一些GIF加载到我的UITableView单元格中。但问题是,每当我尝试从我的缓存加载图像时,单元格在滚动之前会暂停一点。
这是我正在使用的代码
postGif = (UIImageView *)[cell viewWithTag:104];
if ([[ImageCache sharedImageCache] DoesExist:post[@"gif"]] == true)
{
image = [[ImageCache sharedImageCache] GetImage:post[@"gif"]];
postGif.image = [UIImage animatedImageWithAnimatedGIFData:image];
}else
{
dispatch_queue_t backgroundQueue = dispatch_queue_create("cacheImage", 0);
dispatch_async(backgroundQueue, ^{
NSData *imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:post[@"gif"]]];
dispatch_async(dispatch_get_main_queue(), ^{
// Add the image to the cache
[[ImageCache sharedImageCache] AddImage:post[@"gif"] image:imageData];
NSIndexPath* ind = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.feedTableView beginUpdates];
[self.feedTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:ind] withRowAnimation:UITableViewRowAnimationNone];
[self.feedTableView endUpdates];
});
});
}
postGif.layer.cornerRadius = 2.0;
postGif.layer.masksToBounds = YES;
[cell.contentView addSubview:postGif];
我也试过了后台队列。但是Image的负载非常慢。
if ([[ImageCache sharedImageCache] DoesExist:post[@"gif"]] == true)
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,
(unsigned long)NULL), ^(void) {
NSData *image = [[ImageCache sharedImageCache] GetImage:post[@"gif"]];
postGif.image = [UIImage animatedImageWithAnimatedGIFData:image];
});
}else
{
dispatch_queue_t backgroundQueue = dispatch_queue_create("cacheImage", 0);
dispatch_async(backgroundQueue, ^{
NSData *imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString:post[@"gif"]]];
dispatch_async(dispatch_get_main_queue(), ^{
// Add the image to the cache
[[ImageCache sharedImageCache] AddImage:post[@"gif"] image:imageData];
NSIndexPath* ind = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
[self.feedTableView beginUpdates];
[self.feedTableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:ind] withRowAnimation:UITableViewRowAnimationNone];
[self.feedTableView endUpdates];
});
});
}
我不确定我做错了什么。也许我没有抓住一个概念。
Maycoff建议我不应该从后台队列修改用户界面对象(如UIImageView)的属性,并且我需要在后台队列上创建UIImage的实例,有人可以向我解释它是什么我不是在抓?
提前感谢您的帮助。
答案 0 :(得分:6)
您之前的代码中的问题是您是从主队列上的GIF数据创建UIImage
的。由于解码GIF(尤其是具有许多帧的GIF)可能需要一些时间,因此您阻止了主线程,这就是每次需要显示另一个图像时表格视图暂时停止滚动的原因。
以后的代码中的问题是您正在修改后台队列上image
的{{1}}属性。您只能修改主队列上的用户界面对象。
您需要做的是在后台队列上创建UIImageView
,然后调度回主队列以更新UIImage
的{{1}}属性。因此:
UIImageView