注释的重用标识符有什么意义

What is the point of a reuse identifier for annotations

我正在尝试在我正在使用的 mapkit 上实施注释

mapView.register(EventMarkerView.self, forAnnotationViewWithReuseIdentifier: MKMapViewDefaultAnnotationViewReuseIdentifier)

不过,我经常看到这种格式

    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
    guard let annotation = annotation as? Event else { return nil }

    let identifier = "marker"
    var view: MKMarkerAnnotationView

    if let dequeuedView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier)
        as? MKMarkerAnnotationView {
        dequeuedView.annotation = annotation
        view = dequeuedView
    } else {
        view = MKMarkerAnnotationView(annotation: annotation, reuseIdentifier: identifier)
        view.canShowCallout = true
        view.calloutOffset = CGPoint(x: -5, y: 5)
        view.rightCalloutAccessoryView = UIButton(type: .detailDisclosure)
    }
    return view
}

如果我有不止一种类型的注释,我会使用后一种形式吗?

我也很好奇我的MKMapViewDefaultAnnotationViewReuseIdentifier是否有效?我没有选择它,但因为我只有 1 种注释类型,所以应该没关系,对吗?

最后,重用标识符是否还具有dequeueReusableAnnotationView(withIdentifier: identifier)的功能?

这里有很多事情要考虑:

  • MKMapViewDefaultAnnotationViewReuseIdentifier 仅在 iOS 11+ 上受支持,因此如果您想定位更早的 iOS,您可能需要使用后一种形式。
  • 类似于后一种形式的东西不仅在你有不止一种类型的注解时很容易实现;使用重用标识符的要点是,每当注释离开屏幕时,它都可以在不同的注释中重用,这有时会节省大量资源。

底线:

如果仅针对 iOS 11+ 并且只有 1 个注释,您可以使用 MKMapViewDefaultAnnotationViewReuseIdentifier。否则考虑其他形式。

希望这可以帮助您做出决定。