Низкая производительность кластеризации MKMapView в iOS 11
Я использую сторонние библиотеки для обработки кластеров маркеров. Поскольку у iOS 11 есть своя реализация, я решил перейти и удалить сторонние библиотеки от имени "родной" реализации.
Я загрузил пример приложения из WWDC 2017 и выполнил те же действия, поэтому:
- Подключите выход
MKMapView
-
MKAnnotation
протокол MKAnnotation
для моей модели - Создайте
MKMarkerAnnotationView
для просмотра маркера - Создайте представление
MKMarkerAnnotationView
для кластера - Зарегистрируйте обе аннотации на моей ссылке mapView с помощью функции register (
_:forAnnotationViewWithReuseIdentifier:
- Добавить аннотации к моей карте
Тем не менее, при использовании сторонних библиотек все было в порядке, с этим методом я получаю очень низкую производительность, когда я просматриваю свой mapView и меняю регион. Использование ЦП повышается до 90%, в то время как память кажется стабильной, и я чувствую задержку при перемещении, а иногда даже аварии приложений. Я загружаю около 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
}
}
Ответы
Ответ 1
Отсюда вы можете прочитать:
Не создавайте экземпляры этого класса самостоятельно. MapKit автоматически создает аннотации кластеров, когда два или более аннотационных представления группируются слишком близко друг к другу на поверхности карты.
Вы можете попробовать, не создавая экземпляр этого класса самостоятельно.