0

NSFetchedRequest特定のテレビ番組の次の未視聴のエピソードを照会するための適切なものを取得しようとしています。NSFetchedResultsController に渡す必要があるため、 1 つの要求にまとめる必要があります。

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

番組ごとに 1 つ (または 0) のエピソードが返されます。

これを複数のリクエストにまとめることができます。

例: をNSFetchedResultsControllerfetch everyに設定しましたshow。in私は最新のものを得るために- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath毎回繰り返しますShowepisode

+(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から削除する方法はありません。さらに、この方法でソートする方法はありません。それとも、ここで何かが足りないのですか?!UITableViewNSFetchedResultsControllerdataSourceTableViewfirst_aired

4

1 に答える 1

0

フェッチされた結果コントローラーですべての番組をフェッチする代わりに、少なくとも1つの未視聴のエピソードがある番組のみをフェッチできます。これは、次の述語で機能するはずです(「表示」のフェッチ要求の場合)。

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