2009-07-15 7 views
58

私は自分のセルに約50個のカスタムセルを持っていますUITableView。私はURLから画像を取得するセルに画像とラベルを表示したい。UITableViewでレイジーロードイメージ

イメージが読み込まれている間にUIがフリーズしないように、イメージの遅延ロードを行いたいとします。別のスレッドでイメージを取得しようとしましたが、セルが再度表示されるたびに各イメージをロードする必要があります(そうでなければ、セルの再利用で古いイメージが表示されます)。誰かがこの動作を複製する方法を教えてもらえますか?

+0

これらすべてのキャッシュコンポーネントのパフォーマンスを比較したいと思います。 – neoneye

+0

way 1:use nsoperationqueue way 2:ブロックコーディング方法3:library –

答えて

-1

私はこれを達成するために組み込まれている方法については気づいていませんが、既に別のスレッドで作業しているように思えます。

それはあなたが見ておくべきであるビューに戻って来るとき、あなたの唯一の残りの問題は今、セルの内容を無効にされると仮定すると:あなたが前にセルの内容をチェックすることができ、このデリゲートメソッドを実装することにより

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 

新しいコンテンツが必要かどうかを調べます。それができれば、セルの内容を空にして、再度スレッドロードをトリガすることができます。

また、コードを投稿することを検討することもできます。私はあなたがそこに適切なアプローチを見つけることだと思う LazyTableImages ....私はNSOperationのために行くと、あなた何をやってお勧めしたい

26

VEYのアップルから公式例ここで良いあります別のスレッドで必要です。

- (id)initWithTarget:(id)trgt selector:(SEL)sel withImgURL:(NSString *)url { 
    if(self = [super init]) { 
     if(url == nil || [url isEqualToString:@""]) 
      return nil; 
     target = trgt; 
     action = sel; 
     imgURL = [[NSURL alloc] initWithString: url]; 
    } 
    return self; 
} 

- (void)main { 
    [NSThread detachNewThreadSelector:@selector(loadImage) toTarget:self withObject:nil]; 
} 

- (void)loadImage { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    UIImage *img = [UIImage imageNamed: @"default_user.png"]; 
    if(![[imgURL absoluteString] isEqualToString: @"0"]) { 
     NSData *imgData = [NSData dataWithContentsOfURL: imgURL]; 
     img = [UIImage imageWithData: imgData]; 
    } 
    if([target respondsToSelector: action]) 
     [target performSelectorOnMainThread: action withObject: img waitUntilDone: YES]; 
    [pool release]; 
} 

- (void)dealloc { 
    [imgURL release]; 
    [super dealloc]; 
} 

希望に役立ちます:

これは、私は、画像の読み込みのために書いたクラスです!

+0

私はSDWebImageがこれを解読しようとするよりずっと簡単で最適化されていると言わなければなりません。しかし、あなた自身でこれを行うための学習経験が必要な場合は、代わりにLeMarcのチュートリアルを読むことをお勧めします:http://iphonedevelopment.blogspot.com/2010/05/downloading-images-for-table-without.html – JeroenEijkhof

+0

レイジーテーブル画像更新リンク:https://developer.apple.com/library/prerelease/content/samplecode/LazyTableImages/Introduction/Intro.html – GoodSp33d

2

EGOImageLoadingでもお試しいただけます。それを使用する方法を示すデモもあります。

8

私はこのために設計された無料のライブラリを作った... HJCache。その非常に使いやすい。 iphone-image-cache

+17

SDWebImageはMark JohnsonのHJCacheよりはるかにエレガントです。私見では。申し訳ありません。 – fuzz

85

チェックアウト SDWebImage

READMEのセクションは、あなたのアプリでそれを使用する方法を、と言います。

+10

これをさらに優先して投票したいと思います。このライブラリを実装する方法を柔軟にするために、非常に高速でスーパーのシンプルなシンプルなライブラリをお勧めします。 – JeroenEijkhof

+0

誰かがこれをxcode 4.2に正常にインストールしましたか?私は公開ヘッダーを見つけることに問題があります。 – rjgonzo

+0

#import でエラーが表示されていましたが、それは非ARCの手順に従っていました。 –

0

私はあなたがビューのthatsの開始時に、その画像をロードする場合-(void)loadViewがロードされると、その後、ちょうどこれらのイメージを割り当て、nsarrayにそれを取る

を意味し、その問題を解決するための別の方法があると思いますテーブルセルがロードされるときにテーブルセルでビューを作成し、indexPath.rowに従ってこれらのイメージをそのビューにバックグラウンドイメージとして置き換えるか、またはnsarrayインデックスとindexPath.rowのテーブルセルの新しいビューでこれらのイメージのサブビューを作成するだけです。テーブルビューセル

+0

私はこの解決方法が必要です。しかし、私はサンプルソースコードを見つけることができません。誰かが例を持っていますか? –

1

たぶん、あなたはALImageView .ITがSDWebImage.Youよりもはるかに簡単です。あなただけがテーブルビューで別のURLをリロードする画像ビューを再利用することができます2つのソースファイル(ALImageView.h/ALImageView.m)が必要を試すことができます細胞。

  1. ローカルおよびメモリキャッシュをサポートします。
  2. サポート・プレースホルダー;
  3. タップタッチ(ターゲットアクション)をサポートします。
  4. 画像ビューのサポートコーナー。

デモもあります。

16

お試しAFNetworkingクラスこのリンクをこのクラスにダウンロードしてくださいhttps://github.com/AFNetworking/AFNetworking。ただcellForRowAtIndexPathに続いて、このカテゴリに

#import "UIImageView+AFNetworking.h" in your Viewcontroller which contains your Tableview. 

をインポートあなたのproject.Then内のすべてのAFNetworkingクラスを追加します。これは非同期のUITableViewCellでImageViewのためのあなたのイメージをダウンロード

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 

    if (cell == nil) 
    { 
     cell = [[CustomCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; 
    } 

    [cell.imageView setImageWithURL:[NSURL URLWithString:[UrlArray objectAtIndex:indexPath.row]] placeholderImage:[UIImage imageNamed:@"placeholder.jpg"]]; 
    cell.myLabel.text = [imageNameArray objectAtIndex:indexPath.row]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell;  
} 

以下のように置きます。それはキャッシュを持っているので、ユーザーがTableviewをスクロールしながら何度もダウンロードする必要はありません。画像をダウンロードしたら、imageUrlのキーで画像を保存します。私はそれがあなたにとって有益であることを願う。

1

あなたは私は非常にシンプルなもの(customizeLazyTableImages)にlazyTableImagesこのプロジェクトをカスタマイズし、非常にスムーズにこれだけの画像をロードしているいくつかの静的なURLとタイトルを持つすべての余分なコードを削除していたこのlazyTableImages


を試すことができますし、彼らに


+0

私はこれを使用して素晴らしい仲間良い仕事の男です。 –

2

あなたはbutton..youは... githubのから自我イメージボタンファイルをダウンロードしてプロジェクトに追加することができエゴ画像を使用することができます....

をキャッシュします..

自我イメージが非同期リクエストと呼ばれて...

遅延ロードが同期要求と呼ばれ、あなたのXIBでのイメージ図で

変更クラス「自我イメージボタンを」。エゴ画像レスポンスを待たずに一度にすべての画像を表示..

0

NSOperationキューまたはGCDを使用して、バックグラウンドで画像を読み込むことができます。

イメージを何度も読み込みたくない場合は、NSCacheまたはファイルシステムを使用してイメージを保存できます。