NSFetchedResultsController:排序描述符和节

Fog*_*ter 7 core-data objective-c uitableview nsfetchedresultscontroller ios

我有一个像这样的核心数据模型......

[Country] <--->> [League] <--->> [Match]
Run Code Online (Sandbox Code Playgroud)

我正在使用一个NSFetchedResultsController显示Matches成一个UITableView.

我之前已经完成了这一百万次,但出于某种原因这些部分出错了,我无法理解为什么.

我已经创建了类似的排序描述符......

NSSortDescriptor *countrySD = [NSSortDescriptor sortDescriptorWithKey:@"league.country.name" ascending:YES];
    NSSortDescriptor *leagueSD = [NSSortDescriptor sortDescriptorWithKey:@"league.name" ascending:YES];
    NSSortDescriptor *dateSD = [NSSortDescriptor sortDescriptorWithKey:@"startDate" ascending:YES];
    request.sortDescriptors = @[countrySD, leagueSD, dateSD];
Run Code Online (Sandbox Code Playgroud)

首先,我想检查一下我是否按正确的顺序排列.这应首先按顺序排序,country.name然后按league.name顺序排序startDate.

  1. 任何事都Albania应该先于任何事情发生Spain.
  2. 在一个国家,任何东西League 1应该先于任何东西League 2.
  3. 在单个联赛中,所有比赛应该按startDate最早的顺序显示.

然后我NSFRC用这个来创造...

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.moc sectionNameKeyPath:@"league.leagueID" cacheName:nil];
Run Code Online (Sandbox Code Playgroud)

所以这应该通过匹配不同的league.leagueID值对表进行分组.

它应该像......

Albania - League 1
    12:00
    13:00
Albania - League 2
    09:00
    14:00
France - League 1
    09:00
Spain - A League
    08:00
    12:00
Spain - B League
    09:00
Run Code Online (Sandbox Code Playgroud)

虽然不行.我为同一个联盟获得了多个标题.一些匹配出现在错误的标题下...

我已经检查了错误联赛中出现的比赛的值(NSLogged),他们实际上有正确的联赛.所以即使他们Spain - A League出现在France - League A(例如)之下.

知道如何解决这个问题吗?

Mar*_*n R 17

用作sectionNameKeyPath参数的键路径必须与第一个排序描述符中使用的键相同(或生成相同的相对排序).

(据我所知)没有办法使用两个或多个排序描述符将获取结果控制器的结果分组到各个部分.

  • @Fogmeister:或者,您可以添加一个包含"<country>.<league>"的附加属性,并将其用作节键和第一个排序描述符. (4认同)