Проблема производительности при рисовании MKPolyLine поверх MKTileOverlay
У меня есть MKMapView, где пользователь может выбрать, хочет ли он использовать Apple Maps или альтернативный источник карты. На этой карте я рисую MkPolyline, показывающий текущий заголовок. Эта строка обновляется раз в секунду, удаляя и добавляя строку. Мое приложение выполняет множество других вычислений, и в режиме отладки уровень использования процессора составляет около 20% при использовании карт Apple. Если я добавлю MKTileOverlay для использования альтернативного источника карты, уровень ЦП увеличится примерно до 140%.
Кто-нибудь знает причину этого? Чем отличается использование MkTileOverlay?
1 ответ
У меня была такая же проблема, мне потребовалось некоторое время, чтобы понять это, но вот она: это произойдет, когда наложение вашей плиткиoverride func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void)
имеет ошибку (например, из-за ошибки URL или декодирования изображения) иresult
первый параметр обратного вызова имеет значение null. Чтобы решить эту проблему, я вместо этого возвращаю пустые данные изображения. Вот пример:
class MyTileOverlay: MKTileOverlay {
private lazy var emptyImageData: Data? = {
UIGraphicsBeginImageContext(tileSize)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image?.pngData()
}()
override func loadTile(at path: MKTileOverlayPath, result: @escaping (Data?, Error?) -> Void) {
super.loadTile(at: path) { (data, error) in
if let data = data,
var image = UIImage(data: data){
if UIScreen.main.traitCollection.userInterfaceStyle == .dark {
image = image.invert()
}
result(image.pngData(), error)
}else {
result(self.emptyImageData, error)
}
}
}