私はNSFetchedResultsControllerを使用して、データをUITableViewに読み込みます。 これはシンプルなチャットアプリです。最初にテーブルに最新の25のメッセージを読み込み、ユーザーがスクロールして古いメッセージ(チャットメッセージが昇順に表示されている)を表示すると、さらに読み込みます。NSFetchedResultsControllerのためにfetchLimitを動的に設定する
IがsetFetchLimitするメソッド呼び出し:willDisplayCellでNSFetchedResultsControllerための:の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を変更できますか?
すべてのヒットが素晴らしいでしょう! ありがとう!
また、 –
は、uifetchedresultscontrollerdelegate controllerでうまく動作するのかどうかを確認してください。didChangeObject:atIndexPath:forChangeType:newIndexPath:?私のためにはうまくいかない=( – Irina
NSFetchedResultsController.fetchRequestのApple Documentationで述べたように、これを行う前に[NSFetchedResultsController deleteCacheWithName:@ "cacheName"]を呼び出す必要があります: "それを変更してはいけません。キャッシュを無効にしたり、+ deleteCacheWithNameを呼び出すことなく初期化した後、 –