Как я могу быстро обновить MKTileOverlay в MapView? - PullRequest
0 голосов
/ 17 марта 2020

В моем приложении есть функция радара, которая позволяет вам просматривать данные радара с предыдущих отметок времени. Чтобы сделать это, мне нужно быстро обновить наложение плиток, когда пользователь перемещает UISlider. У меня есть рабочая версия этого, но это очень медленно. Как я могу улучшить скорость, с которой представление карты обновляет наложение плитки? (Я звоню changeTile каждый раз, когда меняется UISlider)

class RadarViewController: UIViewController, MKMapViewDelegate {

    var radarOverlay: MKTileOverlay?
    var radarRenderer: MKTileOverlayRenderer?

    var timestamps: [String]! {
        didSet {
            slider.isEnabled = true
        }
    }

    func setupTile(timestamp: String) {
        let template = "https://tilecache.rainviewer.com/v2/radar/" + timestamp + "/256/{z}/{x}/{y}/5/1_0.png"
        let overlay = MKTileOverlay(urlTemplate: template)
        overlay.tileSize = CGSize(width: 256, height: 256)
        overlay.canReplaceMapContent = false
        radarOverlay = overlay
        mapView.addOverlay(overlay, level: .aboveRoads)
    }

    func changeTile(timestamp: String) {
        let template = "https://tilecache.rainviewer.com/v2/radar/" + timestamp + "/256/{z}/{x}/{y}/5/1_0.png"
        let overlay = MKTileOverlay(urlTemplate: template)
        overlay.tileSize = CGSize(width: 256, height: 256)
        overlay.canReplaceMapContent = false
        radarOverlay = overlay
        for o in mapView.overlays {
            mapView.removeOverlay(o)
        }
        mapView.addOverlay(overlay, level: .aboveRoads)
        mapView.setNeedsDisplay()
    }

    func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
        if let o = radarOverlay {
            radarRenderer = MKTileOverlayRenderer(tileOverlay: o)
            return radarRenderer ?? MKOverlayRenderer()
        }
        return MKOverlayRenderer()
    }
}
...