在viewDidLoad中异步加载图像,带有活动指示符

时间:2014-03-30 11:30:53

标签: ios iphone asynchronous viewdidload

当我从视图(通过点击表格中的单元格)切换到显示某些图像的视图时,我将从几个网址加载一些图像。

我希望在加载时显示活动指示器动画。

我在新视图的viewDidLoad中进行此加载。

如果我同步加载图像,那么(毫不奇怪)动画由于请求阻塞而无法正常工作...... 如果我异步加载图像,那么(也不奇怪)视图是用空白而不是图像打开的,而不是等待提取的图像,这是我不想要的。

我试图把所有这些都放在从旧视图转换到新视图的segue代码中,因为我希望只有在加载完成后才会切换视图,但这并不重要。

我怎样才能享受这两个世界?我怎样才能阻止应用程序,显示动画,但只有在所有图像都已加载后才转换到下一个视图?

5 个答案:

答案 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。它完全符合您的要求。

您可以在https://github.com/nicklockwood/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类别)。