【问题标题】:Showing duplicate cells in UITableView via NSFetchedResultsController?通过 NSFetchedResultsController 在 UITableView 中显示重复的单元格?
【发布时间】: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


【解决方案1】:

提取请求不会返回重复的对象。它返回与谓词匹配的所有对象。所以

[NSPredicate predicateWithFormat: @"objectID = %@", oid]
[NSPredicate predicateWithFormat: @"(objectID = %@) OR (objectID = %@)", oid, oid]
[NSPredicate predicateWithFormat: @"objectID IN %@", @[oid, oid]]

返回具有给定对象 ID 的所有一个对象(如果有的话)。

在您的情况下,您已经拥有要显示的对象。因此,我建议将它们存储在一个数组中并将其用作表视图数据源,而不是使用获取的结果控制器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多