我正在尝试使用适当的NSFetchedRequest
来查询给定电视节目的下一个未观看过的剧集。
它应该放在一个请求中,因为我必须将它交给NSFetchedResultsController。
My Model (CoreData):
Show
- Seasons:NSSet<Show>
Season
- Episodes:NSSet<Episode>
Episode
- first_aired:NSDate
- watched:BOOL
每个节目都应该返回1(或0)集。
我可以将它与多个请求放在一起。
例如:
我将NSFetchedResultsController
设置为每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
。
或者我在这里遗漏了什么?!
答案 0 :(得分:0)
您可以仅获取至少有一个未观看过的剧集的节目,而不是获取所提取的结果控制器中的所有节目。这应该与以下谓词一起使用(对于“Show”上的获取请求):
[NSPredicate predicateWithFormat:@"SUBQUERY(seasons, $x, ANY $x.episodes.watched == FALSE).@count > 0"]