2012-01-29 2 views
1

とても遅いです、私はコードの下のような細胞を作成:のtableViewにスクロールすると、私は画像と背後にあるテキストを持っているテーブルビューを持っている

- (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] autorelease]; 

    } 

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    NSDictionary * companyProductRow = [DB getCompanyProductRow:[self.companyProductIDs objectAtIndex:indexPath.row]]; 

    int companyProductID = [[companyProductRow objectForKey:@"ID"] intValue]; 

    cell.tag = companyProductID; 

    cell.textLabel.text = [companyProductRow objectForKey:@"ImagePath"]; 

    NSString* fullPath = [FileManager fullPath:companyProductID fairDirectory:[[self.currentFair objectForKey:@"ID"]intValue]]; 

    [[cell imageView] setImage:[UIImage imageWithContentsOfFile:fullPath]]; 

    return cell; 
} 

私はアップルの開発者向けサイトでのテーブルビューのパフォーマンスに関するいくつかのヒントを読みますが、すべての彼らは言った: 細胞を再利用する。オブジェクトの割り当てには、特に、ユーザーがテーブルビューをスクロールするときなど、短時間に繰り返し割り当てを行う必要がある場合は、パフォーマンスコストが発生します。新しいセルを割り当てる代わりにセルを再利用すると、テーブルビューのパフォーマンスが大幅に向上します。 コンテンツの再レイアウトは避けてください。カスタムサブビューでセルを再利用する場合は、テーブルビューがセルを要求するたびにそれらのサブビューをレイアウトしないでください。セルが作成されると、サブビューを一度レイアウトします。 不透明なサブビューを使用します。テーブルビューセルをカスタマイズするときは、透明ではなく、セルのサブビューを不透明にします。

リンゴサイトのサンプルは同じですが、uitableviewをスクロールするとパフォーマンスが向上する方法はありますか? (ディスクからイメージを読み込むべきとき)。

ありがとう

答えて

3

はいです。
まず、画像を読み込むことができます。
[UIImage imageWithContentsOfFile:fullPath]は常に完全なイメージをメモリに読み込むため、避けてください。これは実際には遅いです。代わりに[UIImage imageNamed:"YOUR_IMGAES_NAME"]を使用してください。最初の使用後に画像をキャッシュしたり、直接ファイルマネージャにプリロード/保存したりするためです。

次の手順では、セル内のすべてのビューをnil(imageViewなど)に設定し、すべてのコンテンツを手作業で描画します。この理由は、UIViewsがかなり遅いからです。表示するラベルや画像などがたくさんある場合、手ですべてを描くのがはるかに高速です。 2ディスクは、セル毎に読み込み、私はデータベースいくつかの並べ替え、および[UIImage imageWithContentsOfFile:...]から二番目のフェッチであると仮定し、あなたの[DB getCompanyProductRow:...]から1をやっているよう

+0

お返事ありがとうございます、もっと説明できます、イメージはディスクにあり、私は完全なイメージパスを持っています、私はパスが "imageNamed"で動作しないと思います...? – ali

+0

あなたの画像が小さければ(私はtableViewCellを想定しています)、私はそれらがアプリケーションの起動時にすべてメモリにロードされます。単に配列を作成し、 'imageWithContentsOfFile:'でイメージをロードしてください。そのための良い場所はFileManagerです。 しかし、私はむしろすべての画像をプロジェクトに追加し、代わりに '[UIImage imageNamed:]'を使用します。 – yinkou

2

あなたtableView:cellForRowAtIndexPath:が見えます。

tableView:cellForRowAtIndexPath:が呼び出される前に(好ましくは[tableview reloadData]の前に)これらの情報をメモリにロードする方法を見つけます。

大規模なデータセットのためのヒント:

メモリアレイにロードするために、あなたが取得するために必要なデータが大きすぎる場合は、単にそのデータのサブセットを表示する必要があるので、いくつかのページングメカニズムを実装しよう。コアデータのNSFetchedResultsControllerを代わりに使用することをお勧めしますが、データベース構造がオブジェクトモデルと互換性がある場合はそうです。

関連する問題