1

我正在Mapview使用快速语言进行开发。因为,我正在将 geojson 文件加载到我的地图视图中,它的加载成功。我正在加载GEOSwift库。它工作正常,但是,发生了什么,在加载数据时,地图视图在 UI 中冻结/卡住了几秒钟,然后显示数据。即使在 Zooming 时间也冻结 UI 几秒钟。

我正在加载LineString类型数据,其坐标约为 7000 个数据。

即使我只是在后台线程中解析数据。

我有两个 3 个选项卡,用于在我的地图中加载不同的数据,其中 3 个geojson

文件。即使将一个数据切换到另一个数据,它也会冻结。

在调试中,在放大/缩小地图视图时会出现以下错误打印。

 [VKDefault] Tile 11720.7599.14 (128) in current unloaded state for 0.01 seconds - Raster Overlays Above Labels - Failed to decode (terminal) (0.01 sec)

我的代码如下。

@IBAction func mapDataAction(_ sender: Any) {
        let overlays = mapView.overlays
        mapView.removeOverlays(overlays)

        self.mapView.removeAnnotations(mapView.annotations)


        DispatchQueue.global(qos: .background).async {
            if let geoJSONURL = Bundle.main.url(forResource: “LineString”, withExtension: "geojson") {
                do {
                    var overlays = [MKPolyline]()
                    let features = try Features.fromGeoJSON(geoJSONURL)
                    for item in features! {
                        if  let item = item.geometries![0] as? LineString {
                            let polyLine = item.mapShape() as! MKPolyline
                            overlays.append(polyLine)
                        }
                    }
                    DispatchQueue.main.async {
                        // add overlays to map
                        self.mapView.addOverlays(overlays)
                    }

                } catch {
                    //handle error
                }
            }
        }
    }

并且有一次应用程序在控制台中抛出以下消息而崩溃。

Terminated due to memory issue

并且它从设备的 cpu 中占用了巨大的内存。

在此处输入图像描述

在滚动 mapview 或 zoomin/zoomout 时,它总是调用委托方法,这使得 mapview 冻结。

public func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer {
    if let polyline = overlay as? MKPolyline {
        let renderer = MKPolylineRenderer(polyline: polyline)
        //renderer.fillColor = UIColor.blue.withAlphaComponent(0.5)
        renderer.strokeColor = UIColor.blue.withAlphaComponent(0.8)
        renderer.lineWidth = 5
         print("MKPolylineRenderer delegate calling")
        return renderer
    }


    return MKOverlayRenderer(overlay: overlay)

 //   fatalError("Unexpected overlay type")
}

我该如何解决这个问题?

4

0 回答 0