ios – MapKit中2000注释的最佳实践

我有一个 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)
    }
}

并且注释视图委托:

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
}

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

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

编辑

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

解决方法

您可以轻松地向MKMapView添加~1,000个注释.看看这个示例项目,增加了3,000个:

https://github.com/incanus/PointTest

您可以采取一些措施来改善这项工作.

>只需使用MKPointAnnotation,您就不必手动提供视图.
>如果确实需要自定义视图,则应正确使用重用标识符.您当前正在为每个注释创建一个新视图,实际上您可以一次又一次地重复使用类似视图以获得更高的性能.
>您正在主UI线程中解析和添加注释,这会影响触摸响应性能.请参阅上面的项目,了解在Grand Central dispatch的后台执行此操作的方法,同时仍然在主UI线程中实际添加注释(所有这些,我可能会添加).

您无需担心注释是否在屏幕上. MapKit为您完成此操作,这就是为什么它在委托回调中查询视图而不是在前端查询.

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

这是iPhone 5s上3000个注释的视频:

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

相关文章

UITabBarController 是 iOS 中用于管理和显示选项卡界面的一...
UITableView的重用机制避免了频繁创建和销毁单元格的开销,使...
Objective-C中,类的实例变量(instance variables)和属性(...
从内存管理的角度来看,block可以作为方法的传入参数是因为b...
WKWebView 是 iOS 开发中用于显示网页内容的组件,它是在 iO...
OC中常用的多线程编程技术: 1. NSThread NSThread是Objecti...