Низкая производительность кластеризации 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 автоматически создает аннотации кластеров, когда два или более аннотационных представления группируются слишком близко друг к другу на поверхности карты.

Вы можете попробовать, не создавая экземпляр этого класса самостоятельно.