Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 下载完成后,如何将通过SDWebImage下载的图像加载到视图控制器中?_Ios_Objective C_Sdwebimage - Fatal编程技术网

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

Ios 下载完成后,如何将通过SDWebImage下载的图像加载到视图控制器中?,ios,objective-c,sdwebimage,Ios,Objective C,Sdwebimage,我有一个由10个URL组成的数组,链接到我网站的图片 我使用SDWebImages进行异步图像下载,并使用for循环在URL数组中运行。但是,在下载第一幅图像之前,代码只需通过For循环运行。因此,不会下载其余图像,也不会显示新的视图控制器 我如何允许代码通过for循环运行,一旦下载了一个图像,它就会弹出一个视图控制器,并在下载新图像时得到更新 这是我的密码: NewViewController *vc = [[NewViewController alloc] initWithNibName:n

我有一个由10个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]

我突然想到几个问题:

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

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

  • 最后,您试图用图像填充数组,但

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

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

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


    如果不是所有图像视图一次都可见,则应进一步改进上述方法(仅加载可见图像视图的图像)。但希望上述内容能回答眼前的问题。

    谢谢。你在第3.1点上是对的。我以为会,但每次它都会弹出一个空的新ViewController。My NewViewController是一个UITableView,显示下载的图像行。我将尝试传递URL数组而不是图像。谢谢@Scott如果您使用的是
    UITableView
    ,那么这就更容易了。只需在您的
    单元格中使用
    setImageWithURL
    即可。无需使用
    图像
    数组,无需手动创建
    UIImageView
    中的
    viewDidLoad
    对象等。操作非常简单。这些
    UIImageView
    类别非常适合与表视图组合。每个单元格需要显示3个图像。此外,我需要检查以确保图像良好,即尺寸大于100 x 100。我需要下载图像并将其存储在其他地方,然后进行分析,然后将图像加载到手机中…@Scott,这很好。但我仍然认为(a)你可以在你的
    完成的
    块中做到这一点;(b) 这个
    setImageWithURL
    逻辑仍然属于
    cellforrowatinexpath
    (或者坦率地说,您正接近我将其放入
    UITableViewCell
    子类中的复杂程度);(c)您永远不想从事维护
    UIImage
    对象数组的工作(如果您想做一些优化,可能是
    NSCache
    ,但永远不想
    NSMutableArray
    )。