为NSFetchedResultsController动态设置fetchLimit [英] Dynamically setting fetchLimit for NSFetchedResultsController

查看:163
本文介绍了为NSFetchedResultsController动态设置fetchLimit的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用NSFetchedResultsController将数据填充到UITableView上。
这是一个简单的聊天应用程序,我想先将最新的25条消息加载到桌面上,然后在用户向上滚动以查看较旧的消息时加载更多消息(聊天消息按升序排列)。

I'm using am NSFetchedResultsController to populate data onto a UITableView. It's a simple chat app and I want to load the latest 25 messages onto the table first and load more as the user scrolls up to see older messages (the chat message are in a ascending order).

我为willDisplayCell中的NSFetchedResultsController调用一个方法setFetchLimit:就像这样....

I call a method that will setFetchLimit: for the NSFetchedResultsController in the willDisplayCell: like so....

- (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,如此.....

when the first row of the UITableView has been displayed, getMoreMessages will try to reset the fetchLimit reload the UITableView like so.....

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

然而,它似乎没有用,表数据不会更改。
初始NSFetchRequest设置如此...

However, it doesn't seem to be working, the table data will not change. The initial NSFetchRequest is set like so...

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?

任何点击都会很棒!
谢谢!

Any hits would be awesome! Thanks!

推荐答案

想出这个。
看起来我必须运行performFetch:更改fetchLimit之后。 :D

figured this one out. looks like I have to run performFetch: after I change the fetchLimit. :D

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

这篇关于为NSFetchedResultsController动态设置fetchLimit的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆