0

我有一个包含 10 个 URL 的数组,这些 URL 链接到我的网站图像。

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

如何允许代码通过 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]
4

1 回答 1

1

我突然想到了几个问题:

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

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

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

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

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

因此,当前视图控制器应该只传递urls数组,并且viewDidLoadofNewViewController可以遍历这些数组,或者 (a) 找到适当的现有图像视图的IBOutlet引用并调用setImageWithURL;或(b)创建一个新的UIImageView,设置它们各自的imageframe/约束并将该图像视图添加到新视图控制器的视图中。但不要创建任何images数组。

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

于 2013-09-29T14:27:13.583 回答