【发布时间】:2013-03-20 12:14:05
【问题描述】:
我正在查询 Core Data 以在一群人中找到“最老”和“最重”。对于较大的数据集,这通常有效(因为重复匹配的机会较小),但对于一个小的数据集,其中最老的人也可能是最重的人,我遇到了问题。
[John, 77, 160]
[Pete, 56, 155]
[Jane, 19, 130]
[Fred, 27, 159]
[Jill, 32, 128]
因为我想在UITableView 的 2 个UITableViewCells 中显示此信息,所以我首先运行 2 NSFetchRequests(一个找到最旧的,第二个找到最重的)我正在他们采取每个托管对象的objectIDs 并将它们添加到我用来设置我的NSFetchedResultsController 的最终NSFetchRequest。
// FETCH REQUEST - OLDEST, HEAVIEST
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"People"];
NSSortDescriptor *descriptor = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:descriptor]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", IDArray];
[fetchRequest setPredicate:predicate];
如果我“打印”最终 NSFetchRequest 的描述,它确实包含 2 个指向 managedObjects 的指针。
(i.e. [John, 77, 160] [John, 77, 160])
我的问题似乎是当我这样做时
[[self fetchedResultsController] performFetch:nil];
UITableView 委托方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
NSArray *sectionArray = [[self fetchedResultsController] sections];
id <NSFetchedResultsSectionInfo> sectionInfo = [sectionArray objectAtIndex:0];
NSUInteger numberOfRows = [sectionInfo numberOfObjects];
NSLog(@"ROWS: %u", numberOfRows);
return numberOfRows;
}
仅将 numberOfRows 显示为 1,并且仅在我的 UITableView 中显示单个 [John, 77, 160]。
【问题讨论】:
-
获取请求不返回重复对象。它返回与谓词匹配的所有对象 - 在您的情况下,这正是一个对象。为什么你需要一个获取的结果控制器?如果您已经有 2 个对象,请将它们放入一个数组并使用普通的表格视图显示。
-
嗨马丁,这是一个好点,有问题的 ViewController 从一个简单的列表和一个获取的结果控制器开始,当我添加额外的搜索和排序时,我一直使用现有的获取结果控制器。到目前为止(测试 5 人,而不是 500 人)我没有发现任何问题,我也不知道 fetch 请求不会返回重复的对象。我将按照您的建议更改代码以使用数组。谢谢,非常感谢。
标签: iphone objective-c uitableview nsfetchedresultscontroller nsfetchrequest