如何限制 NSFetchedResultsController 中的对象数量?

Posted

技术标签:

【中文标题】如何限制 NSFetchedResultsController 中的对象数量?【英文标题】:how to limit number of objects in NSFetchResultsController? 【发布时间】:2011-11-02 08:35:54 【问题描述】:

我有 NSFetchedResultsController 需要在 tableView 中显示数据

我使用 NSFetchedResultsControllerDelegate

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
    DLog(@"controllerWillChangeContent: %@", controller);
    [self.tableViewA beginUpdates];




- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
           atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 

    DLog(@"didChangeSection: %@", controller);

    switch(type) 
        case NSFetchedResultsChangeInsert:
            [self.tableViewA insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;

        case NSFetchedResultsChangeDelete:
            [self.tableViewA deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
    



- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject
       atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type
      newIndexPath:(NSIndexPath *)newIndexPath 

    DLog(@"controller:%@\ndidChangeObject:%@\natIndexPath:%@\nforChangeType:%d\nnewIndexPath:%@\n",controller, anObject, indexPath, type, newIndexPath);

    UITableView *tableView = self.tableViewA;
    DLog(@"%@", self.tableViewA);
    switch(type) 
        case NSFetchedResultsChangeInsert:
                [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationRight];
            break;

        case NSFetchedResultsChangeDelete:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
            break;

        case NSFetchedResultsChangeUpdate:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationNone];
            //[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            break;

        case NSFetchedResultsChangeMove:
            [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
            [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath]withRowAnimation:UITableViewRowAnimationRight];
            break;
    




- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
    [self.tableViewA endUpdates];

在 performFetch 之前我使用

 request.fetchLimit = 100;
    request.fetchBatchSize = 100;

这意味着我想只显示 100 个数据,但是当我做一些会使 NSManagedObjectContext 发生变化的事情时,它会调用 NSFetchedResultsControllerDelegate 并将任何数据插入到 tableView 中。问题是,tableView 可以显示超过 100 条数据..

我使用这个函数来设置 numberOfRowsInSection

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.FetchController sections] objectAtIndex:section];
    CalledRowCountingNotYetCallRowForSection=true;
    [self.tableViewA setBounces:YES];


    if([sectionInfo numberOfObjects]>100)
        //[Timer searchCriteriaChanged];
        CLog(@"Something Wrong This NumberOfRow: %d", [sectionInfo numberOfObjects]);
    
    else
    
    return [sectionInfo numberOfObjects];

如何让tableView不能显示超过100条数据?

【问题讨论】:

【参考方案1】:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

此函数不是调用设置 numberOfRowsInSection 而是获取数字。

-(void)controller:(NSFetchedResultsController *)controller 
       didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
       atIndex:(NSUInteger)sectionIndex 
       forChangeType:(NSFetchedResultsChangeType)type 

DLog(@"didChangeSection: %@", controller);

switch(type) 
    case NSFetchedResultsChangeInsert:
   if([YourtableView numberOfRowsInSection:yourSection]>100)
      return;  //TO avoid insertion 
   
   ...
   ...
   ...
 

【讨论】:

以上是关于如何限制 NSFetchedResultsController 中的对象数量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能两次获取相同的数据? NSFetchedResultsController 为空

启动 Core Data 应用程序时在后台配置 NSFetchedResultsController

如何解除网页限制访问

如何限制用户每日发帖限制 (MERN)

如何限制表单的使用或限制访问

如何限制 MonoTouch 中的 UITextView 字符限制? [复制]