web-dev-qa-db-ja.com

UITableViewの遅延読み込み画像

UITableViewに50個のカスタムセルがあります。 URLから画像を取得するセルに画像とラベルを表示したい。

画像の読み込み中にUIがフリーズしないように、画像の遅延読み込みを行いたいです。画像を別々のスレッドで取得しようとしましたが、セルが再び表示されるたびに各画像をロードする必要があります(そうでない場合、セルを再利用すると古い画像が表示されます)。誰かがこの動作を複製する方法を教えてください。

58
ronny

試してくださいAFNetworkingクラスは、このリンクでこのクラスをダウンロードします https://github.com/AFNetworking/AFNetworking プロジェクトにすべてのAFNetworkingクラスを追加し、このカテゴリをインポートします

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

次にcellForRowAtIndexPath:に以下のように入力します

-(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;    
}

これは、UITableviewcellのimageViewの画像を非同期にダウンロードします。キャッシュもあるため、ユーザーがTableviewをスクロールしている間は何度もダウンロードしません。画像をダウンロードしたら、imageUrlのキーで画像を保存します。役に立つことを願っています。

17
TamilKing

NSOperationに行って、別のスレッドで必要なことをすべて行うことをお勧めします。

これは、イメージのロード用に作成したクラスです。

- (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];
}

お役に立てば幸いです!

3
natanavra

自画像ボタンを使用できます。自画像ボタンファイルをgithubからダウンロードできます...プロジェクトに追加します。

xibの画像ビューでクラス「エゴ画像ボタン」を変更します...

遅延読み込みは同期要求と呼ばれます。

エゴ画像は非同期リクエストと呼ばれます。エゴ画像は応答を待たないでください。一度にすべての画像を表示します。

2
Divine_Code

これを試すことができます lazyTableImages


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


1
ShujatAli

たぶん、 ALImageView を試すことができます。SDWebImageよりもはるかに簡単です。必要なソースファイルは2つだけです(ALImageView.h/ALImageView.m )。画像ビューを再利用して、TableViewセルのさまざまなURLを再ロードできます。

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

良いデモもあります。

1
jiachunke

その画像をロードしたい場合、ビューの開始時にその問題を解決する別の方法があると思います

-(void)loadViewがロードされている場合、テーブルセルがロードされているときにこれらの画像を割り当ててnsarrayに取り込み、indexPath.rowに従ってテーブルセルでビューを作成します。 nsarrayのこれらの画像を背景画像としてそのビューに置き換えるか、nsarrayインデックスとindexPath.rowを使用して、tablecellの新しいビューでこれらの画像のサブビューを作成します。

0
Emon

NSOperationキューまたはGCDを使用して、バックグラウンドで画像をロードできます。

何度も画像をロードしたくない場合は、NSCacheまたはファイルシステムを使用して画像を保存できます。

0
vikram