我在网上搜索了一下,发现了一些关于如何做我想做的事情的想法,但我仍然想知道你认为我应该做些什么。
以下是上下文:
我正在为iOS 5开发一个应用程序。我使用MapKit来显示地图,我添加了大约5000个注释 - 是的,这似乎很多,但不要担心,我使用了集群库:)。为了在每次用户打开地图时不加载它们,我在appDelegate中创建它们(我创建了一个注释数组,并在打开地图时调用[_mapView addAnnotations:[appDelegate.annotationsToAdd allObjects]];
)。创建annotationsToAdd
数组大约需要10秒钟,所以我认为这个解决方案工作得很好(你必须等待那10秒才能被授权打开地图,但你只需等待一次,在推出应用程序)。在每个注释中,我都有一个"链接"到一个对象,它包含一个值数组(15个浮点数)。目前,当我创建注释时,subtitle
方法会返回其中一个值。
在我的地图的ViewController中,我有2个分段控件。第一个有3个段,第二个有5个,它给出了15个组合 - 再次,我的注释中对象的数组具有相同数量的值:)。
所以你可能已经看到了我的问题,我想更新地图上每个注释的副标题(甚至是群集中的注释,因为群集给出了基于它持有的针脚)。我还想要的是根据注释的副标题的值来更新annotationView的颜色/图像。
我可能错了,但根据我的研究,我明白你有删除所有注释,并重新创建它们以便做到这一点。你知道在我的情况下,这是不一个选项。每次更改其中一个控件的值时,我都无法让用户等待10秒。
我看到一篇关于KVO的文章:这可能是一个有效的解决方案吗?
我不太了解NSNotification,但我应该使用它们吗?
我真的很感谢你的帮助,我会更加欣赏一个详细的答案,向我展示在我显然不常见的情况下要遵循的步骤。
提前致谢。
答案 0 :(得分:4)
首先,您应该只是一次添加注释,而不是使用群集库:
配置地图界面时,应立即添加所有注释对象。地图视图使用每个注释对象中的坐标数据来确定相应的注释视图何时需要显示在屏幕上。
(来自MKMapView Class Reference)。
MKMapView将为您管理它们,因此您的应用程序不会变慢。这种方法可能不会比你正在做的慢,然后你理论上可以这样做:
[mapView removeAnnotations:mapView.annotations];
//add your annotations here
如果您想删除所有这些内容,然后将它们全部添加回来。
但是,您必须立即将它们全部删除。如果你知道一个特定的注释,你可以简单地做:
[mapView removeAnnotation:someAnnotation];
[mapView addAnnotation:someOtherAnnotation];
如果您在NSArray中有替换,您甚至可以:
[mapView removeAnnotations:arrayOfOldAnnotations];
[mapView addAnnotations:arrayOfNewAnnotations];
最后,如果您想要修改注释,可以使用KVO(请参阅this Stack Overflow question)来执行此操作,但它同样易于删除,然后添加一个注释,并且用户不会注意到只要你不动画添加。
答案 1 :(得分:2)
我很抱歉,如果我还没有最终了解你的情况,但我觉得我正在努力解决类似的问题,所以我会尝试与你分享我的想法。我会用你的话作为我的回应指南:
“在获得授权打开地图之前,你必须等待那10秒”
您是否了解以下<MKOverlayView>
协议方法(请参阅http://developer.apple.com/library/IOs/#documentation/MapKit/Reference/MKOverlayView_class/Reference/Reference.html):
- (void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context
- (BOOL)canDrawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale
(假设你在整个世界地图上有5000个引脚,而不是每个fx 1km,即没有大量的引脚)你可以将你的五千个分成几个部分,因此引脚的每个部分都要填充在地图上绘制的相应MKMapRect
区域。因此,您的地图按需要填充了针脚/注释,仅适用于任何给定时间的特定区域。根据您的情况,这可能会带来巨大的加速。
这是使用MKMapRect
图块的非常好的演示:https://github.com/mtigas/iOS-MapLayerDemo - 只填充特定地图的信息。您也可以google
使用“Map tiles 256px”之类的内容来了解地图的绘制方式。
“我知道您必须删除所有注释,并重新创建所有注释才能执行此操作。”
为什么要重新创建?您可以访问地图上已有的所有注释 - 为什么不迭代相关的注释类并更新它们的字幕?
类似:
我希望我的观点可以解决你的问题/情况的范围。