3

親愛なるstackoverflowers、

私は迷ってしまいました。

私のアプリでは、次のように Web から 2 つの画像を読み込みます。

-(void)loadImages
{
  ...

  image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]];
  image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]];
}

メインスレッドをブロックしないために、私はGCDを使用します:

dispatch_async( dispatch_get_global_queue(0,0), ^{
            [self loadImages];

その後、これらの画像を私ので使用しますUITableView

if (indexPath.row == 0)
    {
        cell.imageView.image = image1;
    }
    else
    {
        cell.imageView.image = image2;
    }

その後、追加することにしましUIActivityIndicatorたが、いくつかの問題に直面しました。私のコードが正しくないことを理解しています。と を使用NSURLRequestNSURLConnectionて画像を読み込んでUIActivityIndicator.

そのような画像をロードする最も標準的な方法は何ですか? 何を書き直せばいいですか?

4

3 に答える 3

3

iCarousel の父である Nicklockwood による美しい実装である AsyncImageView を使用することをお勧めします。

https://github.com/nicklockwood/AsyncImageView

使い方はとても簡単です。

    #import "AsyncImageView.h"

そしてすべてのimageViewsでこれを行います。

    [imageView setImage:@"default.png"];
    [imageView setImageURL:@"whateverurl/whateverimage.png"];

あなたの場合は次のようになります: [cell.imageView setImageURL:@"yourURL"];

それは魔法のように機能し、私のコードは実稼働中です。ただし、コードを機能させたい場合は、次を試してください。

 UIActivityIndicator *activity =[[UIActivityIndicator alloc] initWithStyle:UIActivityIndicatorWhite];
 [activity setFrame:CGRectMake(100,100,30,30)];
 [self.view addSubview:activity];

 dispatch_queue_t dispatchQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
 dispatch_async(dispatchQueue, ^(void)
 { 
  [activity startAnimating];
 [self loadImages];
 dispatch_sync(dispatch_get_main_queue(), ^{ 
 [yourTableView reloadData];
 [activity stopAnimating];
 [activty setHidden:YES];
 });
 }); 
于 2013-04-07T18:12:08.333 に答える
2

独自のカスタム コードを使用したい場合に通常行うことを説明できます。

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
    NSData * imageData = [NSData dataWithContentsOfURL:_pictureURL];
    dispatch_async(dispatch_get_main_queue(), ^{
        imageView.image = [UIImage imageWithData:imageData];
    });
});

UIImageView+AFNetworkingそれ以外の場合は、メソッドを追加するカテゴリを検討できます

setImageWithURLRequest:placeholderImage:success:failure:

UIImageView

于 2013-04-07T18:06:32.000 に答える
0

コードに問題はありません (動作することを確認したと仮定して)。他の人が NSURLConnection と関連を使用しているからといって、あなたが間違っているわけではありません。

アクティビティ インジケーターを使用するには、次のようにします。

-(void)loadImages
{
  UIActivityIndicator *indicator = ...

  ...
  [indicator startAnimating];
  image1 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl1]];
  image2 = [UIImage imageWithData:[NSData dataWithContentsOfURL:imgUrl2]];
  [indicator stopAnimating];
}

小さなニット-個人的に私は使用します:

   cell.imageView.image = (0 == indexPath.row ? image1 : image2)

誰も C の「条件付き表現」を高く評価していないようです。小さなニットを終了します。

于 2013-04-07T18:08:08.623 に答える