我有一些位置(在本例中为 >3000)与 Core Data 一起存储。打开地图后,我会获取位置并将它们存储在一个数组中。每次更改地图视图区域时,我都会调用一个函数,该函数将计算哪些注释在当前可见,visibleMaprect
并按像素距离过滤它们。(我知道会有更复杂的优化,比如四叉树,但如果不是非常必要的话,我现在不会真正实现它)。这是我的代码:
//locations is an array of NSManagedObjects
for (int i =0 ; i < [locations count]; i++)
{
// managed object class for faster access, valueforkey takes ages ...
LocationEntity * thisLocation = [locations objectAtIndex:i];
CLLocationCoordinate2D coord = CLLocationCoordinate2DMake( [thisLocation.latitude doubleValue], [thisLocation.longitude doubleValue]) ;
// mapRect is mapView.visibleMapRect
BOOL isOnScreen = MKMapRectContainsPoint(mapRect, MKMapPointForCoordinate(coord));
if (isOnScreen)
{
CGPoint cgp = [mapView convertCoordinate:coord toPointToView:mapView];
// compare the distance to already existing annotations
for (int idx = 0; idx < [annotations count] && hasEnoughDistance; idx++)
{
CGPoint cgp_prev = [mapView convertCoordinate:[[annotations objectAtIndex:idx] coordinate] toPointToView:mapView];
if ( getDist(cgp, cgp_prev) < dist ) hasEnoughDistance = FALSE;
}
}
if (hasEnoughDistance)
// if it's ok, create the annotation, add to an array and after the for add all to the map
}
每次缩放/移动后,地图都会冻结几秒钟。我检查了时间分析器,坐标的简单获取有时需要整整 1 秒,有时只需 0.1,即使坐标是我模型中的索引属性......而且这些类型的线条似乎需要很长时间:
CGPoint cgp = [mapView convertCoordinate:coord toPointToView:mapView];
有什么建议如何在不通过此函数的情况下计算两个注释/坐标之间的像素/点距离?或者对 Core Data 有什么优化建议?
谢谢 :)