MapKit - 无需大量 CPU 使用即可在地图上跟踪用户位置
MapKit - Trace User Location on Map Without Massive CPU Usage
我正在尝试在用户在 MKMapView
上移动时用一条线来追踪他们的位置。问题是我目前正在尝试使用多段线跟踪用户的位置,但是当用户的位置更新时,由于添加了一个新点,我不得不重新绘制该线。这占用了大量 cpu 资源,因为我遇到的最大 cpu 使用率约为 200%。我应该如何在不使用大部分可用 cpu 资源的情况下在用户身后画一条路径?下面是我的代码:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
let polyine = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.removeOverlays(mapView.overlays)
mapView.add(polyine)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
coordinates.append(locations[0].coordinate)
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.blue
renderer.lineWidth = 5.0
return renderer
}
在你的 viewDidLoad 中试试这个你可能想在你的视图控制器中遵守 CLLocationmanager 委托。
import Mapkit
class MapViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
let locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
//or you can do
//locationmManager.desiredAccuracy = KCLLocationAccuracyBestForNavigation
}
}
你还可以做更多的省电之类的事情,只需查看他们的文档
KCLLocationAccuracy documentation
你不应该这样做:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
let polyine = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.removeOverlays(mapView.overlays)
mapView.add(polyine)
}
}
因为他们给 CPU 带来了很大的压力。例如,下面的代码怎么样:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
guard coordinates.count > 1 else {
return
}
let count = coordinates.count
let start = coordinates[count-1]
let end = coordinates[count-2]
let polyine = MKPolyline(coordinates: [start, end], count: 2)
mapView.add(polyine)
}
}
我正在尝试在用户在 MKMapView
上移动时用一条线来追踪他们的位置。问题是我目前正在尝试使用多段线跟踪用户的位置,但是当用户的位置更新时,由于添加了一个新点,我不得不重新绘制该线。这占用了大量 cpu 资源,因为我遇到的最大 cpu 使用率约为 200%。我应该如何在不使用大部分可用 cpu 资源的情况下在用户身后画一条路径?下面是我的代码:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
let polyine = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.removeOverlays(mapView.overlays)
mapView.add(polyine)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
coordinates.append(locations[0].coordinate)
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
let renderer = MKPolylineRenderer(overlay: overlay)
renderer.strokeColor = UIColor.blue
renderer.lineWidth = 5.0
return renderer
}
在你的 viewDidLoad 中试试这个你可能想在你的视图控制器中遵守 CLLocationmanager 委托。
import Mapkit
class MapViewController: UIViewController, CLLocationManagerDelegate {
override func viewDidLoad() {
let locationManager = CLLocationManager()
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters
//or you can do
//locationmManager.desiredAccuracy = KCLLocationAccuracyBestForNavigation
}
}
你还可以做更多的省电之类的事情,只需查看他们的文档 KCLLocationAccuracy documentation
你不应该这样做:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
let polyine = MKPolyline(coordinates: coordinates, count: coordinates.count)
mapView.removeOverlays(mapView.overlays)
mapView.add(polyine)
}
}
因为他们给 CPU 带来了很大的压力。例如,下面的代码怎么样:
var coordinates: [CLLocationCoordinate2D] = [] {
didSet{
guard coordinates.count > 1 else {
return
}
let count = coordinates.count
let start = coordinates[count-1]
let end = coordinates[count-2]
let polyine = MKPolyline(coordinates: [start, end], count: 2)
mapView.add(polyine)
}
}