10

UIImageView と UILabel で構成されるカスタム UITableViewCell があります。セルは 320x104px で、imageView はラベルが前にある領域全体を占めます。セルは 8 個しかありません。

ViewDidLoad では、必要なすべての画像を前もって作成し、正しい寸法で辞書にキャッシュしています。

UITableView をスクロールすると、新しいセルに遭遇するたびに顕著な遅延が発生します。使用している画像は既に作成されてキャッシュされているため、これは私には意味がありません。私がセルに求めているのは、その UIImageView が画像をレンダリングすることだけです。

カスタムセルをxibのビューで使用し、それを使用するように UITableView を構成しています:

[self.tableView registerNib:[UINib nibWithNibName:@"ActsCell" bundle:nil] forCellReuseIdentifier:myIdentifier];

セルの作成と構成:

- (UITableViewCell *)tableView:(UITableView *)tableView 
         cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    NSString* reuseIdentifier = @"ActsCell";
    ActsCell* cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier];
    // Configure the cell...
    [self configureCell:cell atIndexPath:indexPath];
    return cell;
}

- (void)configureCell:(ActsCell *)cell atIndexPath:(NSIndexPath *)indexPath 
{
    Act* act = [self.acts objectAtIndex:indexPath.row];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.title.text = act.name;
    cell.imageView.image = [self.imageCache objectForKey:act.uid];
}

遅延の原因は何ですか? 時間のかかる作業はすべて完了しているため、Async を実行しようとしても何のメリットもないように思われます。

4

1 に答える 1

32

ひょっとして、ローカル ファイルから画像を読み込むことはありますか?

Instrumentsを使用することで、遅延読み込みメカニズムがあることがわかりましUIImageた.実際の画像データは、メインスレッドでレンダリングする段階でのみPNGから解凍され、スクロール中に遅延が発生しました.

UIImageそのため、 withメソッドをロードした後、-initWithContentsOfFile:この画像のコンテンツをオフスクリーン コンテキストにレンダリングするコードを追加し、そのコンテキストを新しいものとして保存してinでUIImage使用しました。これにより、スクロールが再びスムーズで見やすくなりました。UIImageViewUITableViewCell

参照の場合、別のスレッドで(ARCを使用して)画像コンテンツの読み取りを強制するために使用している簡単なコードがあります:

UIImage *productImage = [[UIImage alloc] initWithContentsOfFile:path];

CGSize imageSize = productImage.size;
UIGraphicsBeginImageContext(imageSize);
[productImage drawInRect:CGRectMake(0, 0, imageSize.width, imageSize.height)];
productImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIImageそして、そのような方法で作成された のサーフェスは、サポートされているレンダリングに適した形式になると思います。これにより、メイン スレッドでレンダリングするために必要な作業もオフロードされます。

編集:ドキュメントはUIGraphicsGetImageFromCurrentImageContext()、メインスレッドからのみ使用する必要があると言っていますが、ネットまたは SO で検索すると、iOS 4 以降、UIGraphics..メソッドがスレッドセーフになったことがわかります。

于 2012-05-19T11:17:15.040 に答える