2011-10-30 5 views
2

NSFetchedResultsControllerは、バッチサイズを取得するために5に設定されています。ロードが遅いことに気づき、SQLDebugを有効にします。何らかの理由で、一度に5行をロードしていますが、初期ロード時に100行すべてに対してこれを実行しています。ロードされると、一度に5行をロードするように見えます。フェッチバッチサイズを設定するときにNSFetchedResultsControllerがすべてのローをロードするのはなぜですか?

コンソールを見ると、クエリは20回実行されています。合計100行あります。私はこれが最初の5行で1回実行されると予想していたでしょうし、スクロールすると、より多くの行がロードされます。フェッチサイズを変更しようとしましたが、同じ動作があります。

フェッチ結果コントローラの設定は次のとおりです。

- (NSFetchedResultsController*) fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    [NSFetchedResultsController deleteCacheWithName:@"Root"]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Message" inManagedObjectContext:_context]; 

    fetchRequest.predicate = [NSPredicate predicateWithFormat:@"conversation = %@", conversation]; 

    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
           initWithKey:@"timestamp" ascending:YES]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:5]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:_context sectionNameKeyPath:nil 
                cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    [sort release]; 
    [fetchRequest release]; 
    [theFetchedResultsController release]; 

    return _fetchedResultsController;  

} 
+0

NSFetchedResultsControllerで実際にフェッチを実行しているコードを投稿してください。 –

+0

あなたは上記のものとは異なる何かをしたいですか?ありがとう! – tjg184

答えて

4

NSFetchedResultsControllerをtableviewと共に使用します。テーブルビューは、NSFetchedResultsControllerに、パフォーマンス上の理由から表示して保持する必要があると考えられる行を埋めるために必要な数の行を要求します。バッチサイズを人為的に低く保つことで、NSFetchedResultsControllerがストアにもっと往復するようになります。

100に設定して、あなたのパフォーマンスがどのようなものかを確認してください。バッチサイズ100でパフォーマンスに問題がある場合は、コアデータモデルを正規化する必要があります。コアデータのWWDCビデオを2010年からチェックしてください。コアデータとNSFetchedResultsControllerに関連するフェッチを最適化する素晴らしいビデオがあります。

幸運