如何在下载完成后将通过SDWebImage下载的图像加载到视图控制器中?

时间:2013-09-29 14:19:14

标签: ios objective-c sdwebimage

我有10个链接到我网站图片的网址。

我正在使用SDWebImages进行异步图像下载,并使用for循环来运行URL数组。但是代码只能在下载第一张图像之前通过For-loop运行。因此,其余图像永远不会被下载,并且永远不会显示新的视图控制器

如何允许代码通过for循环运行,一旦下载了图像,它就会弹出一个视图控制器,并在下载新图像时进行更新。

这是我的代码:

NewViewController *vc = [[NewViewController alloc] initWithNibName:nil bundle:nil];
NavigationController *navigationController = [[NavigationController alloc] initWithRootViewController:vc];

for (NSString *url in urls) {
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
    [imageView setImageWithURL:[NSURL URLWithString:url]
              placeholderImage:[UIImage imageNamed:@"post-imagePlaceholder"]
                     completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType) {
                             item.image = image;

                             [self.images addObject:item];
                             vc.results = self.images;
                            ;
                         }
    }];
}

[self presentViewController:navigationController animated:YES completion:nil]

1 个答案:

答案 0 :(得分:1)

有几个问题突然发生在我身上:

  1. 您正在创建一组新的图片视图,但从不将它们添加到任何视图(例如addSubView)。

  2. 此外,如果这些视图位于NewViewController,您应该让该控制器执行setImageWithURL调用(例如,在viewDidLoad中),而不是当前的视图控制器。当前视图控制器应该只将urls数组传递给NewViewController

  3. 最后,您尝试使用图像填充数组,但

    • 你写这篇文章的方式,我想你会期望在新的视图控制器出现之前填充self.images。但它不会,因为这个completed块异步发生。

    • 您通常不应该填充图像数组,因为图像需要大量内存。如果您应用中的图片数量增加,您将遇到内存警告。我们通常不应该维护URL数组,让SDWebImage进行缓存以有效地检索图像。

  4. 因此,当前视图控制器应该只传递urls数组,viewDidLoad NewViewController可以遍历这些数组,或者(a)找到适当的现有图像视图'{ {1}}引用并致电IBOutlet;或(b)创建新的setImageWithURL,设置各自的UIImageViewimage /约束,并将该图像视图添加到新视图控制器的视图中。但是不要创建任何frame数组。

    如果并非所有图像视图一次都可见,则应进一步细化上述方法(仅加载可见图像视图的图像)。但希望以上回答了当前的问题。