0

ゆっくりとスクロールしているテーブル ビューがあります。それがなぜなのか誰か知っていますか?

各行に画像がありますが、画像がロードされた後でもまだカクつき、スクロールが遅くなります。

助けてくれてありがとう

ここに私のコードがあります:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"SimpleTableCell";

    SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }
    // Get item from tableData
    NSDictionary *item = (NSDictionary *)[displayItems objectAtIndex:indexPath.row];

    // display the youdeal deal image
    photoString = [item objectForKey:@"image"];
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:photoString]]];

    cell.titleLabel.text = [item objectForKey:@"supercat"];
    cell.descriptionLabel.text = [item objectForKey:@"title"];

    NSString *convertedLeftCount = [NSString stringWithFormat:@"%@",[item objectForKey:@"left_count"]];

    cell.amountLabel.text = convertedLeftCount;

    cell.thumbnailImageView.image = image;
    cell.priceLabel.text = [item objectForKey:@"cat"];

    return cell;
}
4

3 に答える 3

3

これは、使用した画像読み込みメカニズムが原因です。

メインスレッドの url から画像を読み込んでいます。そのため、UI はしばらくの間ブロックされdataWithContentsOfURL:、同期呼び出しでもあります。そのため、UI は画像データを取得した後に応答します。

Apple は、webrequest や膨大なデータの解析などの時間のかかるプロセスは、メイン スレッドではなく他のスレッドで実行する必要があると述べています。また、UI 関連のタスクはすべてメイン スレッドで実行する必要があります。

ソリューション:

  1. メイン スレッドではなく、バックグラウンド スレッドで画像をリクエストします。
  2. 画像を取得したらキャッシュする

ソースコードとサードパーティ ライブラリ

非同期メソッドを使用してイメージをロードする基本的な考え方を理解するのに役立ついくつかのリンクを次に示します。

  1. LazyTableImages
  2. HJキャッシュ
  3. SDWebImage
于 2012-11-23T17:09:12.803 に答える
2

imageWithData: はキャッシュを使用しないため、セルが読み込まれるたびに画像が読み込まれます。

編集:画像を非同期で読み込むことを提案するコメントを見ました。セルごとにカスタム クラスが既にあるので、簡単に実行できます。それが答えだったら、私はそれを投票します

于 2012-11-23T17:08:37.007 に答える
0

私はあなたがこれを言おうとしていると思います。

NSURL* url = [NSURL URLWithString:@"http://www.YourImageUrl.com"];
NSURLRequest* request = [NSURLRequest requestWithURL:url];


[NSURLConnection sendAsynchronousRequest:request
    queue:[NSOperationQueue mainQueue]
    completionHandler:^(NSURLResponse * response,
        NSData * data,
        NSError * error) {
if (!error){
        UIImage* image = [[UIImage alloc] initWithData:data];
    // Now workout with the image
}

}];

これにより、非同期呼び出しが行われ、テーブルビューがロードされた後に画像がロードされます。つまり、画像のロードが完了すると画像が表示されますが、テーブルビューをロードする必要があるときにテーブルがロードされます。

于 2013-10-18T11:35:09.523 に答える