2016-03-02 73 views
1

我正在使用UICollectionView开发应用程序。
它是按日期排列的事件集合。我使用NSFetchedResultsController从数据库中获取数据。但我需要获取当前和未来的活动以及过去两次活动。 对于NSFetchRequest我使用NSCompoundPredicate带有复杂谓词的NSFetchedResultsController

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]]; 
相关问题