NSPredicate фильтрация с помощью вспомогательного метода NSManagedObject - PullRequest
0 голосов
/ 03 августа 2011

У меня есть представление UITable, которое содержит список NSManagedObjects с именем Assignment.Я использую NSPredicate для фильтрации списка.Я фильтрую задания, которые должны отображаться для игрока сегодня и вчера:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"player == %@ AND (day == %@ OR day == %@)", 
                          player, 
                          [NSNumber numberWithInt:[self todaysDayNumber]],
                          [NSNumber numberWithInt:[self yesterdaysDayNumber]]];

Мне нужно добавить дополнительный уровень фильтрации.Я хочу отфильтровать задания, которые должны показываться только раз в две недели.Поэтому я добавил эти методы в Assigment:

-(BOOL)thisWeeks{
  //If this is a weekly assigment
  if ([self.weekly boolValue]) {
    return YES;
  }

  //Determine the week number
  NSCalendar *calendar = [NSCalendar currentCalendar];
  NSUInteger unitFlags = NSWeekCalendarUnit;
  NSDateComponents *dateComponents = [calendar components:unitFlags 
                                                 fromDate:[NSDate date]];
  NSUInteger week = [dateComponents week];

  //Assigned week even?
  if ([self.weekNumber intValue] % 2){
    //Current week even?
    if (week % 2) {
        return YES;
    }  
  } 
  //Assigned week odd?
  if (!week % 2) {
  //Current week odd?
    if (![self.weekNumber intValue] % 2){
      return YES;
    }
  }
//Should not be shown this week.
return NO;
}

возможно ли использовать этот вспомогательный метод "thisWeeks" в качестве фильтра в NSPredicate?

Если я "делаю это неправильно",Я мог бы вручную отфильтровать полученные результаты, но я не уверен, как поместить результаты обратно в NSFetchedResultsController так, чтобы мое представление UITable могло продолжать использовать NSFetchedResultsController.

1 Ответ

1 голос
/ 03 августа 2011

NSPredicate также принимает блоки в качестве предикатов.Вот пример с первой проверкой thisWeeks :

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
    return [self.weekly boolValue];
}];

Теперь вы можете реализовать метод - (BOOL) thisWeeksWithObject: (id) object и написать:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
    return [self thisWeeksWithObject:obj];
}];

Конечно, вы должны изменить self в методе на object .

...