何度も質問されていることは承知していますが、何日もかけて解決策を見つけようとしたので、ご容赦ください。
私は、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;}