2011-07-20 32 views
6

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

我打电话,这将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; 

并回到刚才的问题。

如何动态更改NSFetchedResultsController的fetchLimit?

任何命中将是真棒! 谢谢!

回答

6

想通了这一个。 看起来像我必须运行performFetch:更改fetchLimit后。 :d

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

另外,请确保您重新加载UITableView后缀 –

+0

它与uifetchedresultscontrollerdelegate控制器配合使用:didChangeObject:atIndexPath:forChangeType:newIndexPath:?不适合我=( – Irina

+0

你需要调用[NSFetchedResultsController deleteCacheWithName:@“cacheName”]在执行此操作之前,Apple文档NSFetchedResultsController.fetchRequest指出:“您不得更改它,它的谓词或其排序描述符初始化后不禁用缓存或调用+ deleteCacheWithName“ –

6

使用setFetchLimit,使用setBatchSize Instand,请参见下面详细的回答。

fetchedObjects数组的计数可能不是您想要执行的操作,因为它不会更新持久性存储中的更改。来自NSFetchedResultsController文档:

结果数组只包括由获取请求(fetchRequest)指定的实体实例,并且它与其谓词相匹配。 (如果提取请求没有谓词,则结果数组包括由提取请求指定的实体的所有实例。)

结果数组反映受控对象在托管对象上下文中的内存中状态,而不是他们的状态在持续存储中。但是,返回的数组不会随着托管对象的插入,修改或删除而更新。

如果您只想获取20个对象,请设置NSFetchRequest的提取限制。如果您只想在内存中保留20个对象,请使用NSFetchRequest对象的setBatchSize。