2011-07-20 11 views
6

私はNSFetchedResultsControllerを使用して、データをUITableViewに読み込みます。 これはシンプルなチャットアプリです。最初にテーブルに最新の25のメッセージを読み込み、ユーザーがスクロールして古いメッセージ(チャットメッセージが昇順に表示されている)を表示すると、さらに読み込みます。NSFetchedResultsControllerのためにfetchLimitを動的に設定する

IがsetFetchLimitするメソッド呼び出し:willDisplayCellでNSFe​​tchedResultsControllerための:のUITableViewの最初の行が表示されたときにように....

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if(indexPath.row == 0) 
    { 
     [self performSelector:@selector(getMoreMessages) withObject:nil afterDelay:1.0]; 
    } 
} 

、getMoreMessagesはfetchLimitをリセットしようとしそのようのUITableViewをリロード.....

- (void)getMoreMessages 
{ 
    maxListItems += 25; 
    NSLog(@"set maxListItems: %d", maxListItems); 
    [self.resultsController.fetchRequest setFetchLimit:maxListItems]; 
    [self._tableView reloadData]; 
} 

しかし、表のデータは変更されません、動作していないようです。 初期NSFetchRequestはそう...

NSFetchRequest *chatDataRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"ChatData" inManagedObjectContext:appDelegate.managedObjectContext]; 
[chatDataRequest setEntity:entity]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(key != 0 OR messageNo != 0) and matchNo = %d", matchNo]; 
[chatDataRequest setPredicate:predicate]; 

NSSortDescriptor *sortDescripter1 = [[NSSortDescriptor alloc] initWithKey:@"status" ascending:YES]; 
NSSortDescriptor *sortDescripter2 = [[NSSortDescriptor alloc] initWithKey:@"messageNo" ascending:YES]; 
NSArray *sortDescripters = [[NSArray alloc] initWithObjects:sortDescripter1, sortDescripter2, nil]; 
[chatDataRequest setSortDescriptors:sortDescripters]; 
[sortDescripters release]; 
[sortDescripter1 release]; 
[sortDescripter2 release]; 

[chatDataRequest setFetchLimit:25]; 

NSFetchedResultsController *fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:chatDataRequest managedObjectContext:appDelegate.managedObjectContext sectionNameKeyPath:nil cacheName:[NSString stringWithFormat:@"%d_chat.cache", matchNumber]]; 
[chatDataRequest release]; 
fetchedResultsController.delegate = self; 
NSError *error; 
BOOL success = [fetchedResultsController performFetch:&error]; 
if(!success) NSLog(@"error: %@", error); 
self.resultsController = fetchedResultsController; 

とバックの質問にように設定されています。

どのように動的にNSFetchedResultsControllerのfetchLimitを変更できますか?

すべてのヒットが素晴らしいでしょう! ありがとう!

答えて

6

これを1つ考え出しました。 私はperformFetchを実行する必要があるように見えます:fetchLimitを変更した後。 :D

[self.resultsController.fetchRequest setFetchLimit:maxListItems]; 
[self.resultsController performFetch:&error]; 
+2

また、 –

+0

は、uifetchedresultscontrollerdelegate controllerでうまく動作するのかどうかを確認してください。didChangeObject:atIndexPath:forChangeType:newIndexPath:?私のためにはうまくいかない=( – Irina

+0

NSFetchedResultsController.fetchRequestのApple Documentationで述べたように、これを行う前に[NSFetchedResultsController deleteCacheWithName:@ "cacheName"]を呼び出す必要があります: "それを変更してはいけません。キャッシュを無効にしたり、+ deleteCacheWithNameを呼び出すことなく初期化した後、 –

6

Instand setBatchSizeを使用して、setFetchLimitを使用して、詳細な答えは下記を参照してください。

fetchedObjects配列の数は、永続ストアからの変更を更新しないため、何をしたいのか分からないことがあります。 NSFetchedResultsControllerドキュメントから:

結果配列には、フェッチ要求(fetchRequest)で指定され、その述語に一致するエンティティのインスタンスのみが含まれます。フェッチ要求に述語がない場合、結果配列にはフェッチ要求で指定されたエンティティのすべてのインスタンスが含まれます。

結果配列には、コントローラの管理オブジェクトコンテキストの管理対象オブジェクトのメモリ内状態が反映されます。永続ストア内の状態ただし、返された配列は、管理オブジェクトが挿入、変更、または削除されると更新されません。

オブジェクトを20個しかフェッチしない場合は、NSFetchRequestのフェッチ制限を設定します。メモリに20個のオブジェクトしか保持しない場合は、NSFetchRequestオブジェクトのsetBatchSizeを使用します。

関連する問題