У меня небольшая проблема с отображением изображений радаров дождя на MapKit (переключение между ними каждую секунду). Информация: 14 изображений (каждое: 32-42 КБ, 2000 x 1450 пикселей).
Вопрос 1
Я скачиваю их каждый раз, да. Кэширование на самом устройстве находится в ToDo. Есть предложения?
Вопрос 2
В настоящее время я переключаюсь между этими изображениями каждые 1 секунду (простой таймер на банкомате), выполняя mapView.removeOverlay(layer)
и mapView.addOverlay(newLayer)
. Но это съедает много процессора (около 130%) и памяти. Изображения также мерцают на экране (на моем физическом iPhone), потому что он не получает рендеринг вовремя, этого не происходит на моем эмуляторе iPhone / iPad.
Я храню загруженные изображения в класс / модель (с другой информацией), которая является членом простого var rainLayers = [RainMapOverlay]()
.
Мой код MapKit выглядит так: ViewController.swift
var rainLayers = [RainMapOverlay]()
var currentNumber = -1
func switchBetweenOverlays()
{
if ( currentNumber > -1 )
// remove current overlay
let layer = self.rainLayers[currentNumber]
mapView.removeOverlay(layer)
}
currentNumber += 1
if ( currentNumber > ( self.rainLayers.count - 1 ) )
{
currentNumber = 0
}
let layer = self.rainLayers[currentNumber]
mapView.addOverlay(layer)
}
func mapView(_ mapView: MKMapView, rendererFor overlay: MKOverlay) -> MKOverlayRenderer
{
if ( overlay is RainMapOverlay )
{
return ImageMapOverlayView(overlay: overlay)
}
return MKOverlayRenderer()
}
RainMapOverlay.swift
class RainMapOverlay: NSObject, MKOverlay
{
var coordinate: CLLocationCoordinate2D
var boundingMapRect: MKMapRect
var theImage: UIImage
var layerData: RainMapData
public var alpha: CGFloat
init (_ rainData: RainMapData)
{
layerData = rainData
boundingMapRect = rainData.overlayBoundingMapRect
coordinate = rainData.midCoordinate
alpha = CGFloat(1.0)
// download picture - TODO: caching
let photoUrl = URL(string: rainData.name)
let photoData = try? Data(contentsOf: photoUrl!)
theImage = UIImage(data: photoData!)!
}
}
ImageMapOverlayView.swift
class ImageMapOverlayView: MKOverlayRenderer
{
override func draw (_ mapRect: MKMapRect, zoomScale: MKZoomScale, in context: CGContext)
{
guard let overlay = self.overlay as? RainMapOverlay else {
return
}
let rect = self.rect(for: overlay.boundingMapRect)
context.scaleBy(x: 1.0, y: -1.0)
context.translateBy(x: 0.0, y: -rect.size.height)
context.setAlpha(overlay.alpha)
context.draw(overlay.theImage.cgImage!, in: rect)
}
}
Заранее спасибо!