2011-12-13 12 views
15

タイムプロファイラは、アプリで時間がかかる操作がnibファイルからUITableViewCellsをロードしていることを示しています。最も高価なのは、UITableViewCellに4KBイメージをロードすることです。UITableViewCellをプログラムで作成するか、ペン先からロードする方が速いのですか?

私は次のコードでペン先からUITableViewCellをロードしています:

[[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

は、誰でもプログラムでビューを作成するか、ペン先からUITableViewCellをロードするとの違いを比較していますか?

編集:
私は、ペン先からのUITableViewCellの読み込みとプログラムによるビューの繰り返し実行の時間プロファイルを比較しました。私のテストでは、2つの間を交互に入れて、3〜5秒の間に約10回UITableViewsを実行しました。各テストでは、UITableViewCellのプログラムによる読み込みは、2倍から6倍高速で大幅に高速でした。

誰でもこれらの結果を裏づけできますか?

EDIT: nibファイルを一度読み込み、その後の呼び出しでキャッシュバージョンを使用するように、nibローディングコードを更新しました。

if (self.UITableViewPortaitNib == nil) { 
     self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]]; 
    } 

    self.UITableViewPortaitNib instantiateWithOwner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

私はまた、より一貫性の実行を作成するために、自動化機器を使用し、結果はまだロードUITableViewCellsをプログラムでペン先のためUITableViewCellsをロードするよりも高速であることを示唆しています。ペン先からのUITableViewCellsの平均実行時間は約90msでしたが、UITableViewCellをプログラムで作成するための平均実行時間は50msでした。

+0

あなたのペン先コードを教えてください。 –

+0

見ていただきありがとうございます@robmayoff。ペン先をロードするためのコードを含めるように質問を更新しました。 – Eytan

+0

興味深い発見 - ストーリーボードとプロトタイプのセルを使って実験をやり直すことができますか?テーブルビューではすべてのnibがバックグラウンドで読み込まれますか? – jrturton

答えて

13

UINibオブジェクトを作成してから、新しいセルを作成するたびにinstantiateWithOwner:options:に送信してください。 UINib Class Referenceから:

たとえば、あなたのテーブルビューは、パフォーマンスの大幅な改善を提供することができますUINibオブジェクトにペン先をキャッシュ、テーブルビューセルをインスタンス化するために、nibファイルを使用している場合。

+0

大いに役立ったうわー!あなたが言及したテクニックを使用してNIBからロードするとき、平均実行時間(誘惑者の持続時間)は約300msから90msに落ちました。プログラムでロードすると、平均実行時間は約50ミリ秒でした。 – Eytan

2

このアプローチは、ベースの両方のプログラムニブある意味で、だから私は、一度ペン先セル(cellTemplate)をロードし、必要に応じて複製。

複製は、mutableCopyが機能しなかったため、予想以上に複雑でした。 NSKeyedArchiver往復は、しかし、やった:実際には

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate]; 
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData]; 

を使用すると、生の、燃える、ペダルツー・メタルスピードのために行くしている場合でも、アーカイブテンプレートは一度計算してキャッシュすることができます。

しかし、フレームレートを測定するべきではありませんか?その場合、UIViewの複雑さも影響します。

+0

明日の朝、キー付きアーカイブ方法を試してみます。 フレームレートに関しては良い点に触れています。私がUITableViewCellsへの最も速いメソッドを分析し始めた理由は、私の方向変更アニメーションが極端に遅いためです。このアニメーション中に、2つのUITableViewController間を移動し、UITableViewCellsをロードするときに最も重いスタックトレースが強調表示された時間プロファイラが表示されます。フレームレートを上げる方法の提案はありますか? – Eytan

0

一度ロードされたuitableviewcell nibsを再利用すると、ビューから外に出る可能性があります。次を読む:iOSの5で

iPhone - What are reuseIdentifiers (UITableViewCell)?

+0

あなたはSanjayの良い点を持っています。私のペン先のローディングコードの上の数行は、適切な再利用識別子を持つセルをチェックします。 – Eytan

5

とWWDC 2011のビデオで述べたように、UINibを使用する新しい方法があります。あなたはviewDidLoad:メソッドであなたのペンを登録してからtableView:cellForRowAtIndexPath:メソッドでコードを単純化します。これはあなたのために物事をスピードアップすることができます(しかし、私は比較のタイミングを実行したことがない)。

例:viewDidLoad:で ペン先を登録し、それへの参照を保持:あなたのtableView:cellForRowAtIndexPath:方法で

NSString *myIdentifier = @"ReusableCustomCell"; 
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier]; 

はちょうど(セルのためにそれを返すことが保証されるようnilのためにチェックする必要をお願いしますiOS5の下のセル)を開き、セルを設定します。

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

    ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
    // Your configuration code goes here 
    cell.nameLabel.text = @"some text"; 
    // .... 

    return cell; 
} 

コードはテストされていません。もしこれがUINibだけを使うよりも速かったら、私は興味があります。

+0

これは私の2回目の編集でUINibを使うのと本質的に同じです。私はそれがもっと速くなるとは想像できませんが、確かにプログラムするのがよかったです。私は今からそれをやるつもりです - ありがとう! – Eytan

+0

「self.reuseCustomCell」とは何ですか? – zakdances

+0

self.reuseCustomCellは@property(非原子的、強い)の行に沿ったプロパティです。id reuseCustomCell; –

関連する問題