您好我的应用程序运行良好,它会将注释加载到来自不同plist的几个不同的地图。
我的问题是我的一个plist上有大约5000个注释,地图视图大约需要20秒来显示注释。
有没有办法可以限制加载的注释数量,说当前位置的半径为20公里?
这会缩短加载时间吗?
我不想从头开始重做并建立一个数据库,因为我基本上已经完成,所以我有一个plist。
答案 0 :(得分:1)
我建议的选项,如果你想留下plist,就是把大的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”将包含注释数据,例如Lat 50到51和Lon 100到110 Plist“B”将包含Lat 50至51和Lon 110至120的注释数据 Plist“E”将包含Lat 49到50和Lon 100到110的注释数据 等
我还会有一个额外的“索引”plist,让app知道给定坐标所在的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将在应用程序开始时读取一次。
然后,一旦应用程序具有当前位置(或者只要它变得足够显着),该应用程序将执行以下操作:
addAnnotations
一次性在阵列中添加注释。答案 1 :(得分:1)
5,000分不是很多,我有数据库有100,000点,而且它仍然明显快于那个(我没有使用MapKit)。如果需要20秒,那么它必须为每个标记做一些网络流量吗?
你的plist是否包含每个标记的纬度/经度?如果是这样,那么您可以为地图上的每个标记创建一个CLLocation
对象,并为地图中心创建一个CLLocation
对象,然后使用[mapCentre distanceFromLocation:markerLocation]
来计算距离(在米)从中心到标记。
删除地图上没有的任何内容,你应该好好去。
如果你想将你的plist拆分成较小的文件,我会根据它们的位置拆分它们。例如,纬度/经度以125.1 / -19.1开头的任何标记都在一个文件中。
我在澳大利亚工作的经历是,像墨尔本这样的城市在很小的区域里有很多东西,而这个国家的其他地方几乎是空的。因此很难将事情分成更小的块。
此外,通过乐器中的“时间档案”功能运行您的应用程序,以了解实际需要这么长时间。这是Xcode中的Product -> Profile
菜单项。你可以找到很多关于如何在线使用它的教程。