2012-02-10 67 views
1

嗨我的应用程序运行良好,它将注释从不同的plists加载到几个不同的地图。显示注释的数量限制

我的问题是我的一个plist上有大约5000个注释,而地图视图大约需要20秒来显示注释。

有没有什么办法可以限制当前位置20公里半径的注释量?

这会缩短加载时间吗?

我不想从头开始重做所有事情,并建立一个数据库,因为我基本上都是这样做的,所以我有一个plist。

+0

我认为唯一的选择是将大型plist拆分成覆盖较小区域的小型plist。然后根据当前位置,只加载位于或靠近当前位置的plist(s)。另外,“Xcode”就是IDE,问题不在于IDE。我已将标签更新为“ios”。 – Anna 2012-02-10 13:32:00

+0

谢谢安娜听起来像要走的路,所以我将不得不建立一个if语句来加载某个经纬度之间的区域的某个plist?说澳大利亚有7个州,我应该设立7个声明? – 2012-02-11 01:56:59

回答

1

我建议的选择,如果你想留在plists,是打破大plist到较小的覆盖较小的区域。

如果将它们分成7个澳大利亚州,可以提供您需要的表现水平,那就没问题了。但我会创建更小的区域(全部是矩形),每个区域都覆盖固定的N个度数。 N不应该太小,也不要太大(这取决于您想要显示数据的当前位置有多远)。

例如,你可以打破单一的plist到这样的16个区域(它没有成为一个平方数):

  North 

     A B C D 
West E F G H East 
     I J K L 
     M N O P 

     South 

的plist“A”将包含注释的数据说纬度012到 Plist“B”将包含Lat 50到51和Lon 110到120的注释数据。
Plist“E”将包含Lat 49到50和Lon 100到110的注释数据。
等。

我还会有一个额外的“索引”plist,它可以让应用找出哪个坐标位于哪个plist中,以及plist的邻居是什么。如果当前位置靠近区域的边缘,应用程序就可以从当前位置的plist及其邻居读取注释数据。

该指数的plist的结构可能是这样的:

PlistName NWCoordinate SECoordinate Neighbors 
A   51,100  50,110  B, E, F 
F   50,110  49,120  A, B, C, E, G, I, J, K 

指数的plist将一次在应用程序的启动时读取。

然后,一旦应用程序有当前位置(或者当它改变显著不够),应用程序将执行以下操作:

  • 从地图上删除现有的注释。
  • 使用该索引来确定从哪个plist(s)加载新注释。假设当前位置是49.25,112.3。使用索引,应用程序将F plist及其邻居加载到某个数组中(而不是一次直接映射到地图)。
  • 使用addAnnotations一次性添加数组中的注释。
1

5,000点是不是很多,我有数据库有100,000点,它仍然明显快于(我没有使用MapKit)。如果需要20秒,那么它必须为每个标记进行某种网络流量?

您的plist是否包含每个标记的纬度/经度?如果是这样,则可以为地图上的每个标记创建一个CLLocation对象,并为地图中心创建一个CLLocation对象,然后使用[mapCentre distanceFromLocation:markerLocation]计算从中心到标记的距离(以米为单位)。

放下任何不在地图上的东西,你应该很好走。

如果你想将你的plist分割成更小的文件,我会根据它们的位置来分割它们。例如,任何经纬度以125.1/-19.1开头的标记都将位于单个文件中。

我和澳大利亚一起工作的经历就像墨尔本这样的城市在很小的地区有很多东西,而这个国家的其他地方几乎空无一人。所以很难将东西分成更小的块。

此外,通过乐器中的“时间档案”功能运行您的应用程序,以找出真正需要这么久的内容。这是Xcode中的Product -> Profile菜单项。你可以找到很多教程如何在线使用它。