当我从视图(通过点击表格中的单元格)切换到显示某些图像的视图时,我将从几个网址加载一些图像。
我希望在加载时显示活动指示器动画。
我在新视图的viewDidLoad中进行此加载。
如果我同步加载图像,那么(毫不奇怪)动画由于请求阻塞而无法正常工作...... 如果我异步加载图像,那么(也不奇怪)视图是用空白而不是图像打开的,而不是等待提取的图像,这是我不想要的。
我试图把所有这些都放在从旧视图转换到新视图的segue代码中,因为我希望只有在加载完成后才会切换视图,但这并不重要。
我怎样才能享受这两个世界?我怎样才能阻止应用程序,显示动画,但只有在所有图像都已加载后才转换到下一个视图?
答案 0 :(得分:3)
如果您不想使用第三方库,可以使用GCD(Grand Central dispatch):
dispatch_queue_t imageLoadingQueue = dispatch_queue_create("imageLoadingQueue", NULL);
// start the loading spinner here
dispatch_async(imageLoadingQueue, ^{
NSString * urlString = // your URL string here
NSData * imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
UIImage * image = [UIImage imageWithData:imageData];
dispatch_async(dispatch_get_main_queue(), ^{
// stop the loading spinner here and place the image in your view
});
});
答案 1 :(得分:0)
查看AFNetworking
及其UIImageView
Extension:
setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage;
从指定的URL异步下载图像并进行设置 一旦请求完成。
如果图像在本地缓存,则 立即设置图像,否则指定占位符图像 将立即设置,然后远程图像将被设置一次 请求已经完成。
答案 2 :(得分:0)
你应该看看AsyncImageView
。它完全符合您的要求。
答案 3 :(得分:0)
如果您不想在加载图片时显示某些视图,则可以将其隐藏起来,例如self.imageView.hidden = YES;
加载后,您可以设置图片,然后将hidden
设置为NO
。
如果由于某种原因,在加载完成之前,您不想进入另一个视图,那么我认为您可以制作中间视图,在该视图中,您将下载所有图像,然后将其转换为图像视图,以及通过prepareForSegue:sender:
发送图片。
Aurelien Cobb的回答清除了如何异步加载图像。
答案 4 :(得分:0)
检查SDWebImage(https://github.com/rs/SDWebImage), 它有一个叫prefetcher的东西 - 它会下载图像并将它们保存在缓存中, 之后您将收到回调,并可以转换到新视图。 不用说你必须展示一个微调器(SVProgressHUD或MBProgressHUD), 并在预取回调返回后停止。
https://github.com/rs/SDWebImage/blob/master/SDWebImage/SDWebImagePrefetcher.h
/**
* Assign list of URLs to let SDWebImagePrefetcher to queue the prefetching,
* currently one image is downloaded at a time,
* and skips images for failed downloads and proceed to the next image in the list
*
* @param urls list of URLs to prefetch
*/
- (void)prefetchURLs:(NSArray *)urls;
要在imageView中显示这些图像,只需使用setImageWithURL:method(UIImageView + WebCache类别)。