1

セル内に表示するモデル オブジェクトの NSArray があるとします。データを事前に計算し、モデル内のプロパティとして保持することをお勧めしますか?

多くの人がやっているのを見ます。だから私もそれに従う。しかし、特定の状況に特化するために常に必要ですか?

私の現在の画面では、NSCalendar と NSDateComponents を使用していたモデルごとに日付プロパティから文字列を生成する必要がありましたが、これは cellForRowAtIndexPath を呼び出すたびに重くなった可能性があります。

4

4 に答える 4

4

日付の書式設定は、一般にコストのかかる手順と見なされます ( docs read: Cache Formatters for Efficiency )。このような種類のオブジェクトの場合、単一のインスタンスを初期化してキャッシュすることは、 を呼び出すたびに新しいインスタンスを作成するよりもはるかに優れていますcellForRowAtIndexPath。これは、NSCalender や NSDateformatters などに適用されます。日付書式設定オブジェクトのインスタンスを 1 つだけ作成している限り、それらを使用してもcellForRowAtIndexPathパフォーマンスが著しく低下することはありません。次のように、セルまたはテーブルビューのデリゲートのクラス メソッドでこれらのオブジェクトをキャッシュしてみてください。

+ (NSDateFormatter *)dateFormatter {

    static NSDateFormatter *dateFormatter = nil;

    if(!dateFormatter) {
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"EEEE LLL d, yyyy | h:mma"];
    }
    return dateFormatter;
} 
于 2013-07-30T14:23:11.957 に答える
1

このメソッドのドキュメントには、通常、パフォーマンス上の理由からセルを再利用すると記載されています。したがって、何度も呼び出されると想定できます。

于 2013-07-30T14:12:23.633 に答える
1

そのメソッドはセルが表示されるたびに呼び出されるため、そこから長い計算を削除します。

モデルによって大きく異なります。

CoreData を使用している場合は、テーブル セル専用の計算データを保持する一時的なプロパティを検討することをお勧めします。NSManagedObject には awakeFromFecth があり、物事を事前に計算できます。さらに、フェッチされたコントローラーなどのようなものがあります。

CoreData を使用していない場合は、同じメカニズムまたはその重要な部分を実装しようとしますが、既にそれを行っていると読みました。NSOperation 内で非同期に計算を実行し、UIActivityIndi​​cator を表示して、終了したらすぐにテーブルにデータを入力することができます。

于 2013-07-30T14:19:35.137 に答える
1

cellForRowAtIndexPathセルが表示または変更されるたびに (スクロールによって) 呼び出されるため、ここで実行されるソースはそれほど多くないはずですが、データによって異なります。大量のデータを持ち運ぶ前にすべてのデータを準備する必要がある場合、読み込み時間が長くなり、デバイスのメモリが不足します。

于 2013-07-30T14:07:03.873 に答える