我一直在使用第三方库来处理标记聚类。由于iOS 11有自己的实现,我决定继续代表“本机”实现移除第三方库。
我已经从WWDC 2017下载了示例应用,并按照相同的步骤进行操作:
MKMapView
插座MKAnnotation
协议MKMarkerAnnotationView
MKMarkerAnnotationView
_:forAnnotationViewWithReuseIdentifier:
)函数然而,在使用第三方库时,一切都很好,使用这种方法,当我平移我的mapView并更改区域时,我的性能非常差。 CPU使用率提高了90%,而内存似乎保持稳定,我觉得移动延迟,有时甚至是app崩溃。我正在加载大约600个注释。
有什么建议吗?
以下是代码:
class MapViewClusteringViewController: UIViewController, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
private var databaseService: LocalDataService!
override func viewDidLoad() {
super.viewDidLoad()
mapView.delegate = self
mapView.register(StopMarker.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)
mapView.register(StopCluster.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultClusterAnnotationViewReuseIdentifier)
databaseService.fetchMarkers { markers in
mapView.addAnnotation(markers)
}
}
}
class StopMarker: MKMarkerAnnotationView {
override var annotation: MKAnnotation? {
willSet {
clusteringIdentifier = "busStopCluster"
subtitleVisibility = .adaptive
markerTintColor = .red
}
}
}
class StopCluster: MKMarkerAnnotationView {
override init(annotation: MKAnnotation?, reuseIdentifier: String?) {
super.init(annotation: annotation, reuseIdentifier: reuseIdentifier)
displayPriority = .defaultHigh
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override var annotation: MKAnnotation? {
willSet {
if let cluster = newValue as? MKClusterAnnotation {
markerTintColor = .green
glyphText = "\(cluster.memberAnnotations.count)"
}
}
}
}
class StopAnnotation: NSObject, MKAnnotation {
var coordinate: CLLocationCoordinate2D
var title: String?
init(coordinate: CLLocationCoordinate2D, title: String) {
self.coordinate = coordinate
self.title = title
}
}
答案 0 :(得分:4)