3

非常に複雑なUIViewControllerがあり、読み込みが非常に遅くなることがあります。4〜5秒かかる場合があります。

私はCoreDataを使用-com.apple.CoreData.SQLDebug 1していますが、データの読み込みであると設定し、除外しました。 CoreData: annotation: total fetch execution time: 0.0166s for 314 rows.

このデータをUITableViewにロードしましたが、最初に表示された行のみがrenderendを取得するという印象を受けたため、行数(現在500未満)に関係なく、UIViewの表示が遅くなることはありません。

機器を調べてTimeProfilerをチェックアウトしましたが、このUIViewのどのメソッドが遅いかを判断する方法がわかりませんでした。

助言がありますか?

更新:
これは私のカスタム行の高さが原因でした。表示されるデータの前に、すべての行を最初に計算する必要が
あります。パフォーマンスの問題が発生する前に、すべての行に対してheightForRowAtIndexPathが呼び出され、UITableViewの行数はいくつですか。

4

1 に答える 1

2

私は最近、UITableViewControllerCoreDataを介して最大8000行を管理していたものを持っていました。データはNSFetchedResultsController;で管理されていました。NSFetchedResultsControllerで使用しているかどうかはわかりませんがNSFetchRequest、Core Dataを介して入力されたテーブルを表示している場合は、それを強くお勧めします。

とは言うものの、フェッチとレンダリングのパフォーマンスを向上させるために作成するときにできる調整はたくさんあります。NSFetchRequestこれがパフォーマンスのボトルネックだと思います。テーブルの初期レンダリングが高速になり、ユーザーがテーブルをスクロールするときに追加のフェッチが実行されるように、行のバッチをフェッチできます。

[fetchRequest setFetchBatchSize:25];

パフォーマンスチューニングとコアデータに関するAppleのガイドを読むことをお勧めします。

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdPerformance.html

Instrumentsを使用しているので、(上記のリンクに従って)Core Dataキャッシュのミス、フェッチ、および保存も確認してください。それはあなたに時間が費やされている場所の指標を与えるかもしれません。

cellForRowAtIndexPath:ビューがロードされたときとユーザーがテーブルビューをスクロールしたときの行数を確認するなど、ブレークポイントテーブルメソッドを設定してみることもできます。

また、次のように設定しました。これにより、私の状況でパフォーマンスが向上したようです。

[fetchRequest setShouldRefreshRefetchedObjects:YES];
[fetchRequest setReturnsObjectsAsFaults:NO];

Re:欠点、これがAppleのNSFetchedRequestドキュメントに書かれていることです:

デフォルト値はYESです。結果タイプ(resultTypeを参照)がNSManagedObjectIDResultTypeの場合、オブジェクトIDにはプロパティ値がないため、この設定は使用されません。返されたオブジェクトからプロパティ値にアクセスする必要があることがわかっている場合は、returnsObjectsAsFaultsをNOに設定して、パフォーマンスを向上させることができます。

コアデータは非常に複雑になる可能性があります。1つだけ使用する場合は、NSManagedObjectContextErica'Sadunの優れたiPhoneDeveloper'sCookbookからの「コアデータヘルパー」を確認してください。Core Dataで多くのことを行う場合は、MagicalRecordネストされたマージNSManagedObjectContexts、複数のスレッドの処理など、多くの面倒な作業を処理できるものを強くお勧めします:https ://github.com/magicalpanda/MagicalRecord

お役に立てれば!

于 2012-12-01T22:06:01.990 に答える