Alamofire を使用してサーバーからデータを要求し、これらのデータを使用して地図上に位置を表示しています。マップをパンまたはズームする場合、API を要求してマップをリロードする必要がありました。
現在の問題は、ズームまたはパンするたびに、CPU が 100% を超えると、ズームとパンができなくなることです。
私のコードは以下の通りです:
アラモファイアのリクエスト:
func getResultMap() {
DispatchQueue.main.async( execute: {
self.skipSearchRequest = true
SearchWebservice.sharedInstance.getResultMap(currentSearchObject, success: { (result) in
var clusters: [Cluster] = []
var markers : [Marker] = []
if self.mapLayerType == .ClusterOverview {
for item in result.clusterOverview {
clusters.append(item)
}
self.setMapAnnotations(annotations: clusters)
} else {
for item in result.markers {
markers.append(item)
}
self.addMapAnnotations(annotations: markers)
}
self.skipSearchRequest = false
}) { (error) in
print(error)
}
})
}
注釈の追加/削除:
func addMapAnnotations(annotations: [MKAnnotation]) {
var annotationsToRemove :[MKAnnotation] = []
var annotationsToAdd: [MKAnnotation] = annotations
let annotationsTemp: [MKAnnotation] = annotations
for item in mapView.annotations {
if item.isKind(of: Cluster.self) {
annotationsToRemove.append(item)
} else if item.isKind(of: Marker.self) {
for itemTemp in annotationsTemp {
if itemTemp.coordinate.latitude == item.coordinate.longitude && itemTemp.coordinate.longitude == item.coordinate.longitude {
annotationsToAdd.remove(at: annotationsToAdd.index(where: {$0.coordinate.latitude == itemTemp.coordinate.latitude && $0.coordinate.longitude == itemTemp.coordinate.longitude})!)
}
}
}
}
mapView.removeAnnotations(annotationsToRemove)
mapView.addAnnotations(annotationsToAdd)
}
func setMapAnnotations(annotations: [MKAnnotation]) {
self.mapView.removeAnnotations(self.mapView.annotations)
var annotationsToAdd: [MKAnnotation] = []
for item in annotations {
if item.isKind(of: Cluster.self) {
annotationsToAdd.append(item)
} else if item.isKind(of: Marker.self) {
annotationsToAdd.append(item)
}
}
DispatchQueue.main.async {
self.mapView.addAnnotations(annotationsToAdd)
}
}
マップ デリゲート:
func mapView(_ mapView: MKMapView, regionDidChangeAnimated animated: Bool) {
if !skipSearchRequest {
Timer.scheduledTimer(timeInterval: 0.7, target: self, selector: #selector(COHFResultMapViewController.getResultMap), userInfo: nil, repeats: false)
} else {
skipSearchRequest = false
}
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if annotation.isKind(of: Cluster.self) {
let reuseId = "Cluster"
var clusterView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId) as? ClusterView
if clusterView == nil {
clusterView = ClusterView(annotation: annotation, reuseIdentifier: reuseId)
} else {
clusterView?.annotation = annotation
}
return clusterView
} else {
let reuseId = "Pin"
var annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: reuseId)
if annotationView == nil {
annotationView = AnnotationView(annotation: annotation, reuseIdentifier: reuseId)
} else {
annotationView?.annotation = annotation
}
return annotationView
}
}
Mapkit でアノテーションをリロードするためのパフォーマンスとベスト プラクティスを改善するにはどうすればよいですか?