2016-03-02 2 views
1

Я разрабатываю приложение с помощью UICollectionView.
Это коллекция событий, упорядоченных по дате. Я использую NSFetchedResultsController для извлечения данных из БД. Но мне нужно получить текущие и будущие события + 2 прошлых события. Для NSFetchRequest Я использую NSCompoundPredicateNSFetchedResultsController с сложным предикатом

NSPredicate *nextPredicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [NSDate date]]; 
NSPredicate *previousPredicate = [NSPredicate predicateWithFormat:@"startAt < %@", [NSDate date]]; 
NSCompoundPredicate *resultPredicate = [NSCompoundPredicate andPredicateWithSubpredicates: @[nextPredicate, previuosPredicate]]; 
fetchRequest.predicate = resultPredicate; 

И я понятия не имею, как ограничить previousPredicate получить только 2 вещи.

+0

Вы можете использовать 'setFetchLimit' ограничить количество возвращаемых элементов, но это работает по всему запросу, так что вы, возможно, придешься Посмотрите на расщепление запросов и как-то расчесывайте результаты. Также вам нужно добавить 'NSSortDescriptor', чтобы убедиться, что у вас есть 2 ближайших к сегодняшнему дню – Flexicoder

ответ

1

Если вы знаете дату текущего события чем создать метод, который возвращать дату последнего события для выборки, а затем установить предикат на главной NSFetchRequest этой даты.

-(NSDate *)dateOfPastEvent{ 
    NSFetchRequest *request = [[NSFetchRequest alloc]init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"startAt" ascending:NO]; 
    [request setSortDescriptors:@[sortDesc]]; 

    NSError *error = nil; 
    NSArray *array = [_mainContext executeFetchRequest:request error:&error]; 


    __block NSDate *pastEventDate; 

    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){ 

     if ([obj valueForKey:@"startAt"] == currentEventDate) { 
      if (array.count >= idx+2) { 
       pastEventDate = [[array objectAtIndex:idx+2] valueForKey:@"startAt"]; 
       *stop = YES; 
      } 

     } 
    }]; 


    return pastEventDate; 

} 

Теперь установите предикат Возвращены даты

NSFetchRequest *requestForController = [[NSFetchRequest alloc]init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityName" inManagedObjectContext:_mainContext]; 
    [requestForController setEntity:entity]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"startAt >= %@", [self dateOfPastEvent]]; 
Смежные вопросы