0

我正在尝试正确NSFetchedRequest查询给定电视节目的下一个未观看的剧集。它应该放在一个请求中,因为我必须将它交给 NSFetchedResultsController。

My Model (CoreData):
 Show
   - Seasons:NSSet<Show>
 Season
   - Episodes:NSSet<Episode>
 Episode
   - first_aired:NSDate
   - watched:BOOL

每个节目都应该返回 1(或 0)集。

我可以将它与多个请求放在一起。

例如:我将NSFetchedResultsControllerup 设置为获取每个show. 在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath我迭代每一个Show以获得最新的episode

+(Episode *)nextAiringEpisodeForShow:(Show *)show{


    NSTimeInterval timeinterval = 0.0;
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeinterval];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Episode"];
    request.predicate = [NSPredicate predicateWithFormat:@"season.show = %@ AND watched = false AND season.seasonNumber > 0 AND first_aired > %@",show,date];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"first_aired" ascending:NO];
    request.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    return  [[show.managedObjectContext executeFetchRequest:request error:nil] lastObject];
}

这样做的问题是:有些节目已经看过所有剧集。这些将显示为(null)UITableView并且无法从 中删除它们,UITableView因为NSFetchedResultsController设置为dataSource。此外,以这种方式进行排序TableView时无法排序first_aired。还是我在这里遗漏了什么?!

4

1 回答 1

0

您可以仅获取至少有一个未观看的剧集的节目,而不是在 fetched results 控制器中获取所有节目。这应该与以下谓词一起使用(对于“Show”上的获取请求):

[NSPredicate predicateWithFormat:@"SUBQUERY(seasons, $x, ANY $x.episodes.watched == FALSE).@count > 0"]
于 2012-11-25T16:02:02.340 回答