NSFetchedResultsController在performFetch之后忽略fetchLimit

时间:2012-01-26 17:35:42

标签: objective-c core-data ios5 nsfetchedresultscontroller

我有一个标签式应用程序,它有2个标签,带有2个UITableView 我还有2个NSFetchedResultsController类型对象,但它们都在同一个实体上,具有不同的排序和不同的获取限制。
当我从Internet下载更多对象并将它们插入数据库时​​,我的NSFetchedResultsController类型对象将忽略fetchLimit。对于第一个我设置fetchLimit为10,第二个我设置fetchLimit为50.最初我在数据库中有10个对象。一切都好。下载了40多个对象之后,第一个对象也加载了40个对象,但它的fetchLimit为10.

这有什么问题?

2 个答案:

答案 0 :(得分:2)

NSFetchedResultsController忽略fetchLimit,以防观察者上下文发生变化。

我认为当你被限制为fetchlimit时,通过momc观察正确更新表并不是那么简单。

解决方案#1

因此,如果发生了大的更新,您应该重新获取数据。

所以你应该在FRC委托中做这样的事情:

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
   [self.tableView endUpdates];
   if (bigChangesPeformed) {
     NSError * error;

     // Re-fetching to get correct fetch limit
     [self.fetchedResultsController performFetch:&error];
     if (error) {
        // bla-bla-bla
     }
     [self.tableView reloadData];

   }
}

答案 1 :(得分:-2)

NSFetchRequest的获取限制是从数据存储执行提取时使用的限制。它并不打算限制获取的结果数组的大小。如果要限制tableview中显示的单元格总数,则应该使用UITableView的tableView:numberRowsForSection:来限制它。

如果你真的想设置一个只显示10个项目的限制(比如显示前10个列表),那么可能没有真正的理由使用超过1个部分。如果使用numberOfSectionsInTableView:将tableView中的节数限制为1,并使用tableView:numberRowsForSection:将该节中的行数限制为最多10行,那么无论有多少记录,您的表将始终显示最多10条记录记录被添加到数据存储中。

您可以使用排序描述符来排序由NSFetchedResultsController实例管理的对象,我想这对于显示前10个列表非常有用。