Проблема производительности при рисовании 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)
            }
        }
    }
Другие вопросы по тегам