写下问题实际上可以解决问题的经典案例之一。在这种情况下,不幸的是在实际发布几分钟后。对不起。
解决方案很简单:我只需再添加两个谓词,一个用于检索之前的数据点,一个用于检索请求的数据范围之后的数据点,然后将数组合并在一起。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext];
[request setEntity:entity];
// Get the the last point (closest to now) first.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[request setFetchLimit:1]; // Keeps the application fast and the memory requirements low.
[sortDescriptors release];
[sortDescriptor release];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"creationDate > %@",realEndDate];
[request setPredicate:predicate];
NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
// Get the data within the requested range.
sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];
sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
[request setFetchLimit:200]; // Keeps the application fast and the memory requirements low.
[sortDescriptors release];
[sortDescriptor release];
predicate = [NSPredicate predicateWithFormat:@"creationDate > %@ AND creationDate < %@",beginDate, realEndDate];
[request setPredicate:predicate];
NSMutableArray *additionalFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
[mutableFetchResults addObjectsFromArray:additionalFetchResults];
[additionalFetchResults release];
// Get the first point last
[request setFetchLimit:1];
predicate = [NSPredicate predicateWithFormat:@"creationDate < %@",beginDate];
[request setPredicate:predicate];
additionalFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
[mutableFetchResults addObjectsFromArray: additionalFetchResults];
[additionalFetchResults release];