0

Twitter API を使用して JSON で解析するアプリを作成しています。画像をセルに読み込むたびに、複数の画像が取得され、すべてが遅くなります。一度画像を取得してから、同じ画像をすべてのセルに入れるにはどうすればよいでしょうか。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"TweetCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}
NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];


NSString *text = [tweet objectForKey:@"text"];
NSString *time = [tweet objectForKey:@"created_at"];
time = [time stringByReplacingOccurrencesOfString:@" +0000 "withString:@"/"];


NSString *twitterImage = [[tweet objectForKey:@"user"] objectForKey:@"profile_image_url_https"];
NSString *completeImage = [NSString stringWithFormat:@"%@", twitterImage];
NSData * imageData = [[NSData alloc] initWithContentsOfURL: [NSURL URLWithString: completeImage]];
imageLabel.image = [UIImage imageWithData: imageData];
cell.imageView.image = [UIImage imageWithData: imageData];


cell.textLabel.text = text;
cell.textLabel.numberOfLines = 3;
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@", time];
  }
return cell;
}

今はこのように見えますが、スクロールすると本当にラグが発生します。 http://gyazo.com/8ab8325f3921fdb7e4f0ea0107d389ac.png

4

4 に答える 4

1

問題は次の行にあるように見えます:

NSDictionary *tweet = [tweets objectAtIndex:indexPath.row];

NSString *twitterImage = [[tweet objectForKey:@"user"] objectForKey:@"profile_image_url_https"];

各セルの画像の新しいコピーを取得していると思います。各 indexPath.row は新しいツイートであるため、複数の twitterImage を取得しています

于 2013-05-23T16:12:15.523 に答える
0

あなたが直面している問題は、メインスレッドですべての画像をダウンロードしているためです。

これを解決するには、次のいずれかを行います。

  1. NSOperationQueue を使用して別のスレッドを使用して画像をダウンロードします。同じことに関する良いチュートリアル: http://www.raywenderlich.com/19788/how-to-use-nsoperations-and-nsoperationqueues

  2. このクラス「AsyncImageView」を使用します。私はこれを使用しましたが、うまく機能します。したがって、UIImageView の代わりに AsyncImageView クラスを使用する必要があり、このライブラリはダウンロードを非同期で管理します。
    https://github.com/nicklockwood/AsyncImageView

于 2014-01-01T11:00:06.023 に答える
0

常に同じ画像である場合は、クラス パラメータ (たとえば ) でテーブルをロードする前にそれをロードし、viewDidLoad常にこのパラメータを使用します。

動的な場合は、 を使用してバックグラウンドで画像を読み込みますperformSelectorInBackground

于 2013-05-23T16:08:23.250 に答える
0

画像にはキャッシュを使用する必要があります。このリンクがお役に立てば幸いです:

http://khanlou.com/2012/08/asynchronous-downloaded-images-with-caching/

于 2013-05-23T18:55:10.800 に答える