5

何度も質問されていることは承知していますが、何日もかけて解決策を見つけようとしたので、ご容赦ください。

私は、RSS パーサー、テキスト、詳細、画像を含むテーブル ビューを持っています。

画像は単純な GCD 非同期で読み込まれます: 何百もの結果に対する高速スクロール。接続が良好であれば、遅延もエラーもありません。

問題は、セルが再利用されているため、一瞬の間、ロード時にちらつくことです。また、接続が悪い場合は、画像がぼろぼろになることがありますが、テキスト/詳細は正しいですが、画像だけが古いです...繰り返しますが、テキスト/詳細は正常に更新され、決して間違って再キューイングされません画像は、悪い接続/前後の高速スクロールでキューに入れられることはめったにありません。

私の質問は、誰かが cell.accs.views をキャッシュ/タグ付けするのを手伝ってくれますか? cellID を設定しようとしましたが、実装に問題がありました。以下のコードは、接続が遅くならない場合にうまく機能します。気にしないセルを再キューイングするときにわずかにちらつくだけです。

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

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];

    [cell.textLabel setNumberOfLines:3];
    cell.textLabel.font = [UIFont boldSystemFontOfSize:14.0];

    [cell.detailTextLabel setNumberOfLines:3];
    cell.detailTextLabel.font = [UIFont systemFontOfSize:12.0];
    cell.detailTextLabel.textColor = [UIColor blackColor];
}

RSSItem * rssItem = (RSSItem *)(_rssParser.rssItems)[indexPath.row];

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
dispatch_async(queue, ^{
    //This is what you will load lazily
    NSData   *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:rssItem.imageURL]];
    dispatch_sync(dispatch_get_main_queue(), ^{

        UIImageView *accImageView = [[UIImageView alloc] initWithImage:[UIImage imageWithData:data ]];

        [accImageView setFrame:CGRectMake(0, 0, accImageView.image.size.width, 92)];
        cell.accessoryView = accImageView;

        //[cell setNeedsLayout];//not needed
    });
});

[cell.textLabel setText:rssItem.title];
[cell.detailTextLabel setText:rssItem.summary];

return cell;}
4

4 に答える 4

0

これが私が SDWebImage を使用して行ったことです。すべてのセルにプレースホルダーを使用することを余儀なくされました。画像のないセルを小さなシェブロン アイコンに設定しただけです。期待どおりに動作します。みんなありがとう。

RSSItem * rssItem = (RSSItem *)(_rssParser.rssItems)[indexPath.row];

if (rssItem.imageURL == nil ){
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 20, 20)];
    [imageView setImageWithURL:[NSURL URLWithString:rssItem.imageURL] placeholderImage:[UIImage imageNamed:@"chevron.png"]];
    cell.accessoryView = imageView;
}else{
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 110, 96)];
    imageView.contentMode  = UIViewContentModeScaleAspectFit;
    [imageView setImageWithURL:[NSURL URLWithString:rssItem.imageURL] placeholderImage:[UIImage imageNamed:@"loading.png"]];
    cell.accessoryView = imageView;
}

[cell.textLabel setText:rssItem.title];
[cell.detailTextLabel setText:rssItem.summary];

return cell;
于 2013-05-10T17:42:33.530 に答える