Динамическая установка fetchLimit для NSFetchedResultsController

Я использую NSFetchedResultsController для заполнения данных в UITableView. Это простое приложение для чата, и я хочу сначала загрузить последние 25 сообщений в таблицу и загружать больше, когда пользователь прокручивает страницу вверх, чтобы увидеть более старые сообщения (сообщения чата расположены в возрастающем порядке).

Я вызываю метод, который будет setFetchLimit: для NSFetchedResultsController в willDisplayCell: вот так ....

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

когда отображается первая строка UITableView, 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;

И возвращаясь к вопросу.

Как можно динамически изменять fetchLimit для NSFetchedResultsController?

Любые совпадения были бы потрясающими! Спасибо!

6
задан Jiho Kang 20 July 2011 в 02:02
поделиться