MapKit中2000+注释的最佳实践

jsk*_*dd3 8 xcode mapkit ios swift xcode6

我有一个JSON文件,当地图摄像机高度低于750米时,我需要在地图上显示大约2,000个位置.这是我目前的代码:

func addStops() {
    var path: String! = NSBundle.mainBundle().pathForResource("stops", ofType: "json")
    var jsonData: NSData! = NSData(contentsOfFile: path)
    var jsonResult: NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonData, options: NSJSONReadingOptions.MutableContainers, error: nil) as NSDictionary
    self.busStops = jsonResult["results"] as NSArray

    for (var i = 0; i < self.busStops.count; i++) {
        let lat = self.busStops[i]["latitude"] as NSString
        let lng = self.busStops[i]["longitude"] as NSString

        var annotation = busAnno()
        annotation.setCoordinate(CLLocationCoordinate2DMake(CLLocationDegrees(lat.doubleValue), CLLocationDegrees(lng.doubleValue)))
        annotation.type = "stop"
        self.mapView.addAnnotation(annotation)
    }
}
Run Code Online (Sandbox Code Playgroud)

并且注释视图委托:

func mapView (mapView: MKMapView!, viewForAnnotation annotation: MKPointAnnotation!) -> busMarker! {
    var pinView = MKAnnotationView(annotation: annotation, reuseIdentifier: "point")
    pinView.location = annotation.location
    pinView.hidden = true
    pinView.layer.hidden = true
    pinView.enabled = false
}
Run Code Online (Sandbox Code Playgroud)

我认为只是隐藏视图就可以逃脱,但是在应用程序添加标记后甚至响应之前需要20秒,然后无法平滑地移动地图(降至每秒约5帧).

所以,如果我不能那样做,那么更好的方法是什么?我猜测每次地图移动时检查一对坐标是否在屏幕边界内都会因滞后而无法正常工作(基于每次检查2000坐标).有任何想法吗?

编辑

您将只看到2000年的10个注释,因为您必须非常放大才能看到任何注释.这只是我使用哪种方法快速查找区域中的注释而没有这种可怕的延迟的情况.

inc*_*nus 4

您可以轻松添加约 1,000 个注释MKMapView。看一下这个示例项目,它添加了 3,000:

https://github.com/incanus/PointTest

您可以采取多种措施来使这项工作变得更好。

  1. 只需使用MKPointAnnotation,那么您就不必手动提供视图。

  2. 如果您确实需要自定义视图,则应该正确使用重用标识符。您当前正在为每个注释创建一个新视图,而实际上您可以一次又一次正确地重用类似的视图以获得更高的性能。

  3. 您正在主 UI 线程中解析和添加注释,这会影响触摸响应性能。请参阅上面的项目,了解使用 Grand Central Dispatch 在后台执行此操作的方法,同时仍然在主 UI 线程中实际添加注释(我可能会一次性添加)。

您无需担心注释是否在屏幕上。MapKit 会为您完成此操作,这就是为什么它在委托回调中而不是预先查询视图的原因。

以下链接不再有效(2017 年 10 月)

以下是 iPhone 5s 上实时注释的 3,000 条视频:

https://dl.dropboxusercontent.com/u/575564/3000points.mov