0

これが私がcellForRowAtIndexPathで呼んでいるものです:

   NSManagedObjectContext *context = [[AppDelegate sharedAppDelegate] managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"Favorites" inManagedObjectContext:context];
    [fetchRequest setEntity:entity];

    NSPredicate *requestPredicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(link like '%@')",articleLink]];
    [fetchRequest setPredicate:requestPredicate];

    [fetchRequest setFetchBatchSize:1];
    NSError *error = nil;
    NSUInteger count = [context countForFetchRequest:fetchRequest error:&error];
    NSLog(@"Count - %d", count);
    if (count == 0)
        return NO;
    else
        return YES;

基本的に、アイテムが私のモデルに存在するかどうかをチェックします。かなり便利ですが、こんなに短い時間で大量のフェッチリクエストを行うのに問題があると思いましたか?

バッテリー管理に問題がありますが、これが呼び出されるたびにディスクから読み取られますか?

何か良いですか?

ありがとう!

4

2 に答える 2

2

スクロールしているときにフェッチを実行する必要はありません。スクロールパフォーマンスが低下します。

あなたが言及したコードから、リンクが保存されているかどうかに基づいてセルに何かを行おうとしています。

View Controllerをロードしてメモリに保存し、スクロールしながらその値を確認するときに、おそらくその操作を前もって実行します。

于 2012-11-11T14:27:32.657 に答える
1

あなたがしていることにいくつかの問題があります。まず第一に、フェッチはディスク上にある永続ストアから実際に読み取られるため、非常に低速です。データベースが大きくなり、クエリ(NSPredicate)が複雑になるほど、フェッチは遅くなります。

次に、cellForRowAtIndexPathが呼び出される回数を制御することはできません。セルが表示されるたびに、セルごとに1回だけ呼び出されると想定できますが、他の状況でも呼び出される可能性があります。また、ユーザーがScrollViewをどのように使用するかを制御することはできません。ユーザーは、狂ったようにスクロールしようとする可能性があります。そのメソッド内のすべてが可能な限りパフォーマンスが高くなければならず、メインスレッドの速度を落とすことはできません。そうしないと、ScrollViewが絶えずフリーズし、ユーザーにとって非常に見栄えが悪くなります。

第3に、常に新しいオブジェクト(この場合はNSFetchRequests)を割り当てて初期化しますが、これにはコストがかかります。キャッシングを使用するとパフォーマンスが大幅に向上します。可能な場合は、常に新しいオブジェクトの割り当てを避けるようにしてください。これはすでに悪い例ですが、fetchRequestはグローバル変数として簡単に格納でき、各フェッチの前に述語を変更できます。

コードからわかるように、リンクを保持するFavoriteというエンティティ、リンクを表示するTableViewがあり、そのリンクがお気に入りかどうかに基づいてセルについて何かを変更したいようです。

ViewControllerが最初にロードされたときにすべてのお気に入りをフェッチし、それらのすべてのリンクを配列に格納し、cellForRowAtIndexPathにarticleLinkがその配列に存在するかどうかを確認する必要があります。そうすれば、ユーザーがScrollViewをスクロールしたときにのみメモリから読み取ることができ、パフォーマンスが最適になります。

于 2012-11-12T09:15:44.967 に答える