1

我正在开发一个 iPhone 应用程序,它在折线图中绘制一个大型数据库,通过核心数据访问。我正在使用基于图块的方法来呈现此图。数据点之间的距离是不规则的。

每个图块使用一个谓词来检索与该图块相关的数据:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"creationDate > %@ AND creationDate < %@",tileBeginDate, tileEndDate];

[请求集合谓词:谓词];

NSMutableArray *result = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];

我在绘制位于不同瓦片中的数据点之间的线时遇到问题,因为绘制这条线需要瓦片范围之外的数据点。

理想情况下,我希望能够获得超出核心数据请求范围的一个数据点。有没有办法做到这一点?如果没有,还有其他建议吗?

4

1 回答 1

0

写下问题实际上可以解决问题的经典案例之一。在这种情况下,不幸的是在实际发布几分钟后。对不起。

解决方案很简单:我只需再添加两个谓词,一个用于检索之前的数据点,一个用于检索请求的数据范围之后的数据点,然后将数组合并在一起。

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];
于 2010-10-15T10:41:43.577 回答