1

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 でアノテーションをリロードするためのパフォーマンスとベスト プラクティスを改善するにはどうすればよいですか?

Xcode コンソールのデバッグ出力

4

1 に答える 1