2016-07-20 7 views
0

Ich habe einen benutzerdefinierten MKOverlayRenderer. Ich füge ein MKOverlay (auch benutzerdefiniert) zur MKMapView nach der ersten Änderung der Region hinzu (wenn es vom Standard-Ort zum Benutzer wechselt). Die Rendering-Geschwindigkeit war ziemlich verzögert, also habe ich die Funktionsaufrufe protokolliert.Wie oft ist drawMapRect: zoomScale: inContext: soll heißen?

2016-07-20 14:03:21.486 MyApp[360:38679] mapView:regionDidChangeAnimated: 
2016-07-20 14:03:22.351 MyApp[360:38679] addOverlay:level: 
2016-07-20 14:03:22.353 MyApp[360:38679] mapView:rendererForOverlay: 
2016-07-20 14:03:22.460 MyApp[360:38709] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.460 MyApp[360:38706] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.501 MyApp[360:38709] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.504 MyApp[360:38706] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.504 MyApp[360:38707] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.560 MyApp[360:38707] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.562 MyApp[360:38709] drawMapRect:zoomScale:inContext: 
2016-07-20 14:03:22.582 MyApp[360:38713] drawMapRect:zoomScale:inContext: 

Dies ist ohne das Gerät zu berühren. Soll drawMapRect: zoomScale: inContext so wiederholt aufgerufen werden?

+0

@matt Sind Sie sicher, dass dies nicht typisch ist? Meine App verfügt über eine kleine Menge Code, der in einem sekundären Thread ausgeführt wird, nachdem eine HTTP-Anforderung zurückgegeben wird, aber alles, was mit der GUI zu tun hat, befindet sich in einem 'dispatch_async (dispatch_get_main_queue(),^{})' -Block. – DaiBu

+0

Sicher, ich könnte falsch liegen. Die "Verzögerung" könnte woanders sein. Sie können Instrumente zum Überprüfen verwenden. – matt

+0

@matt Oh, du bist der gleiche Typ, der geantwortet hat. Lol. Ja, ich denke, das Betriebssystem verwendet mehrere Threads auf eigene Faust. Ich habe das Rendering auf MKMapRect gekürzt, das von der Funktion bereitgestellt wird, und jetzt ist es blitzschnell. Ich fing an, die letzten 4-6 Stunden zu bereuen, die ich verbrachte, zu lernen, wie man die Überlagerungen besonders anfertigt. Jetzt zahlt es sich aber aus. Danke, Mann. – DaiBu

Antwort

0

Wird drawMapRect: zoomScale: inContext angeblich so wiederholt aufgerufen?

Ja. Die sichtbare Karte besteht aus Kacheln. drawMapRect:zoomScale:inContext: wird einmal für jede Kachel aufgerufen (wie Sie wissen würden, wenn Ihre Implementierung tatsächlich den eingehenden rect-Parameter betrachtet hätte).

+0

Ah, Gotcha! Ja, ich fühle mich jetzt dumm. Ich bin normalerweise ziemlich gut darin, alle Parameter zu verstehen, bevor ich einen Override benutze. Ich habe nur ein bisschen Eile bei diesem Projekt. Ich werde dafür sorgen, dass es kein Threading-Problem gibt, wie Matt in seinem OP-Kommentar andeutet, und dann gebe ich das Häkchen. Vielen Dank. – DaiBu