UITableView
に50個のカスタムセルがあります。 URLから画像を取得するセルに画像とラベルを表示したい。
画像の読み込み中にUIがフリーズしないように、画像の遅延読み込みを行いたいです。画像を別々のスレッドで取得しようとしましたが、セルが再び表示されるたびに各画像をロードする必要があります(そうでない場合、セルを再利用すると古い画像が表示されます)。誰かがこの動作を複製する方法を教えてください。
試してください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のキーで画像を保存します。役に立つことを願っています。
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];
}
お役に立てば幸いです!
自画像ボタンを使用できます。自画像ボタンファイルをgithubからダウンロードできます...プロジェクトに追加します。
xibの画像ビューでクラス「エゴ画像ボタン」を変更します...
遅延読み込みは同期要求と呼ばれます。
エゴ画像は非同期リクエストと呼ばれます。エゴ画像は応答を待たないでください。一度にすべての画像を表示します。
これを試すことができます lazyTableImages 、
私はlazyTableImagesこのプロジェクトを非常にシンプルなものにカスタマイズしました( customizeLazyTableImages )、いくつかの静的なURLとタイトルを持つすべての余分なコードを削除しました。
たぶん、 ALImageView を試すことができます。SDWebImageよりもはるかに簡単です。必要なソースファイルは2つだけです(ALImageView.h/ALImageView.m )。画像ビューを再利用して、TableViewセルのさまざまなURLを再ロードできます。
良いデモもあります。
その画像をロードしたい場合、ビューの開始時にその問題を解決する別の方法があると思います
-(void)loadView
がロードされている場合、テーブルセルがロードされているときにこれらの画像を割り当ててnsarray
に取り込み、indexPath.row
に従ってテーブルセルでビューを作成します。 nsarray
のこれらの画像を背景画像としてそのビューに置き換えるか、nsarray
インデックスとindexPath.row
を使用して、tablecellの新しいビューでこれらの画像のサブビューを作成します。
NSOperationキューまたはGCDを使用して、バックグラウンドで画像をロードできます。
何度も画像をロードしたくない場合は、NSCacheまたはファイルシステムを使用して画像を保存できます。