Far*_*cli 5 mapkit mkmapview ios mktileoverlay swift
我使用自定义 TileOverlay 开发了 iOS 地图应用程序,它从我们自己的服务器加载图块。我扩展了 TileOverlay 类,它获取图块数据如下:
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()
}
}
Run Code Online (Sandbox Code Playgroud)
该应用程序工作正常,但是当我快速放大/缩小或平移到随机方向时,图块加载速度非常慢。尤其是在 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()
Run Code Online (Sandbox Code Playgroud)
它多次增强了加载图块,但加载完成时,出现空白图块。这是因为缩放级别计算不正确(我找到了几种查找缩放级别的方法,但没有一个方法可以明确解决此问题)。
我使用的是MapKit sdk,Swift的版本是3.0
所以我的问题是,如何优化图块加载过程?如何取消不必要的线程?对于此类问题有什么建议。提前致谢。
| 归档时间: |
|
| 查看次数: |
1286 次 |
| 最近记录: |