0

私の Web サイトの画像にリンクされている 10 個の URL の配列があります。

非同期イメージのダウンロードと for ループに SDWebImages を使用して、URL の配列を実行しています。しかし、最初のイメージがダウンロードされる前に、コードは For ループを介して実行されます。したがって、残りの画像はダウンロードされず、新しいビュー コントローラーは表示されません。

コードを for ループで実行できるようにするにはどうすればよいですか。画像がダウンロードされると、View Controller がポップアップし、新しい画像がダウンロードされるたびに更新されます。

これが私のコードです:

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これを書いた方法では、新しいView Controllerが表示される前にデータが入力されることを期待していると思います。しかし、このcompletedブロックは非同期で発生するため、そうはなりません。

    • 画像は膨大な量のメモリを必要とするため、通常は画像の配列を設定するべきではありません。アプリ内の画像の数が増えると、メモリ警告が発生します。通常、URL の配列を維持するべきではなくSDWebImage、画像を効率的に取得するためにキャッシュを実行する必要があります。

そのため、現在のビュー コントローラーはurls配列を渡すだけでよく、(a) 適切な既存の画像ビューの参照viewDidLoadNewViewController見つけてIBOutletを呼び出しsetImageWithURLます。または (b) 新しいUIImageViewを作成し、それぞれimageの およびframe/constraints を設定し、そのイメージ ビューを新しいビュー コントローラーのビューに追加します。imagesただし、配列は作成しないでください。

一度にすべての画像ビューが表示されない場合は、上記のアプローチをさらに改良する必要があります (表示される画像ビューの画像のみをロードするため)。しかし、うまくいけば、上記が当面の質問に答えます。

于 2013-09-29T14:27:13.583 に答える