Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS MKMapView加载自定义磁贴优化_Ios_Swift_Mkmapview_Mapkit_Mktileoverlay - Fatal编程技术网

iOS MKMapView加载自定义磁贴优化

iOS MKMapView加载自定义磁贴优化,ios,swift,mkmapview,mapkit,mktileoverlay,Ios,Swift,Mkmapview,Mapkit,Mktileoverlay,我已经开发了带有定制TileOverlay的iOS地图应用程序,它可以从我们自己的服务器加载Tile。我扩展了TileOverlay类,该类获取的平铺数据如下: override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) { let url = self.url(forTilePath: path) if let cachedData = cach

我已经开发了带有定制TileOverlay的iOS地图应用程序,它可以从我们自己的服务器加载Tile。我扩展了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()
    }
}
该应用程序正常工作,但当我快速放大/缩小或平移到随机方向时,瓷砖加载速度非常慢。尤其是在iPad上,加载当前视图大约需要一分钟。我将print(path.z)添加到方法
“loadTile”
,并意识到mapView请求的tile不在所选区域中。结果,所选区域的加载速度非常慢。我将
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()
let task=session.dataTask(其中:request作为URLRequest,completionHandler:{data,response,error->Void in
**让zoomLevel=self.getZoom()
如果Double(path.z)zoomLevel+2{
打印(“通过缩放取消”)
返回
}**
如果let data=data{
self.cache.setObject(数据为AnyObject,forKey:url为AnyObject)
}
结果(数据、错误)
打印(“”)
})
task.resume()
它多次增强加载瓷砖,但加载饰面时,会出现空白瓷砖。这是因为缩放级别的计算不正确(我找到了几种方法来查找缩放级别,但没有一种方法是确定的)

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


所以我的问题是,如何优化瓷砖加载过程?如何取消不必要的线程?对这类问题有什么建议吗。提前谢谢。

我已经找到了问题的答案。如果有人感兴趣,请与我联系。你可以在这里回答你自己的问题,并将其标记为答案。如果你不愿意,请这样做mind@FarizSiracli我也很想看到你的答案。@Farizziracli我正在我的应用程序中寻找类似的优化。你介意发布你对这个问题的答案吗?@Farizziracli答案是什么?