5

关于在 iOS 中向地图添加注释(使用标准 mapkit 方法 - 因此使用 Apple 地图),我遇到了性能问题。(void)addAnnotations:(NSArray *)annotations我正在尝试使用该方法批量添加大量注释(10000+) 。注释对象没有什么特别的 - 一个非常基本的类,MKAnnotation只使用定义如下的构造函数来实现:

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d {
    if(self = [super init]) {
        title = ttl;
        coordinate = c2d;
    }

    return self;
}

为了测试,我创建了一个基本应用程序,它只是在加载时将注释添加到基本地图视图中,在 iPad 2 上大约需要 6-7 秒。非常可接受的性能。但是,当我在自己的应用程序中嵌入相同的基本地图视图时,事情变得复杂了。这是完全相同的逻辑,但是当我在我的应用程序中执行此操作时,加载所有注释大约需要 50 秒。

我的应用程序彼此之间有很多视图。为了查明问题,我从最低级别开始嵌入地图视图,直到达到最高级别。我已经在每个步骤中进行了分析,看看它是否有助于提高性能,但我没有看到任何结果——它仍然是 50 秒左右。现在,我的应用程序基本上只是加载注释并将注释添加到顶层和唯一的地图视图,理想情况下与独立应用程序相同,但无论出于何种原因,我仍然看到注释渲染大约需要 50 秒。我唯一合理的解释是关于我拥有的一些应用程序设置以某种方式干扰了地图性能。我做了一堆阅读来提出一个无济于事的解决方案。

有人对这里可能出现的问题有任何想法吗?谢谢!

4

1 回答 1

1

没有实际的“问题”。我的意思是,您有超过 10000 次分配、绘制和渲染实际上对应用程序的性能产生了影响。

我的建议是拦截地图上的用户导航。使用类似的东西[mapView visibleMapRect]在屏幕上获取地图的可见部分。获取矩形的坐标(可能稍微大一点,以便用户在移动地图时不会注意到)并仅加载该矩形内的注释。

当用户移动时,您只需加载新矩形中的注释减去已在前一个矩形中加载的注释。我想您也可以在它们离开屏幕时删除注释。

这有点类似于 Apple 在处理滚动视图时建议做的事情。我记得用户必须加载滚动视图的前一个和下一个部分的内容(并释放前一个视图的内容)的应用程序,这样才能降低内存消耗并保持良好的用户体验.

尝试考虑用户正在查看的内容,尝试仅显示与该部分(或在 MKMapView 行话中称为区域)相关的注释,我认为您的应用程序响应能力会立即提高。

于 2013-02-15T11:29:11.207 回答