iOS MKMapView加载自定义磁贴优化

时间:2017-08-29 11:15:27

标签: ios swift mkmapview mapkit mktileoverlay

我开发了带有自定义TileOverlay的iOS Map应用程序,它从我们自己的服务器加载切片。我扩展了TileOverlay类,它获取如下的tile数据:

override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void)
{
    let url = self.url(forTilePath: path)
    if let cachedData = cache.object(forKey: url as AnyObject) as? NSData
    {
        result(cachedData as Data, nil)
    } else {

        let session = URLSession.shared
        let request = NSURLRequest(url: url)
        let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in

            if let data = data {
                self.cache.setObject(data as AnyObject, forKey: url as AnyObject)
            }
            result(data, error)
        })
        task.resume()
    }
}

该应用程序正常工作,但当我快速放大/缩小或平移到随机方向时,瓷砖加载速度非常慢。特别是在iPad中加载当前视图大约需要一分钟。我将print(path.z)添加到方法"loadTile",并意识到mapView请求不在所选区域中的切片。在结果中,所选区域的加载速度非常慢。我将if条件放入线程执行块

        let task = session.dataTask(with: request as URLRequest, completionHandler: {data, response, error -> Void in

        **let zoomLevel = self.getZoom()
        if  Double(path.z)  < zoomLevel - 2  || Double(path.z) > zoomLevel + 2 {
            print("cancelled by zoom")
            return
        }**
        if let data = data {
            self.cache.setObject(data as AnyObject, forKey: url as AnyObject)
        }
        result(data, error)
        print("")
    })
    task.resume()

它增强了多次装载瓷砖,但在装载完成时,有空白瓷砖。这是因为缩放级别没有正确计算(我找到了几种方法来查找缩放级别,但是没有一种方法可以解决这个问题)。

我正在使用MapKit sdk,而Swift的版本是3.0

所以我的问题是,如何优化拼贴加载过程?如何取消不必要的线程?对此类问题的任何建议。提前谢谢。

0 个答案:

没有答案