Ich verwende eine benutzerdefinierte MKOverlay/MKOverlayView
, um die Google-Grundkarte vollständig mit meinen eigenen Kacheln zu bedecken, die asynchron geladen werden. Ich folge dem Muster des Anforderns von entladenen Kacheln, wenn ich einen canDrawMapRect:zoomScale:
-Aufruf an meine Überlagerungsansicht erhalte (und in diesem Fall FALSE zurückgebe) und dann setNeedsDisplayInMapRect:zoomScale:
aufruft, sobald die Kachel verfügbar ist.
Das funktioniert im Allgemeinen und scheint im Simulator perfekt zu funktionieren.
Allerdings bekomme ich auf dem Gerät manchmal ein "Loch" in der Überlagerung - eine fehlende Kachel.
Ich kann sehen, dass die Kachel angefordert wurde und dass die Anfrage abgeschlossen wurde. Ich kann sehen, dass ich setNeedsDisplayInMapRect:zoomScale:
anrufe und dass ich die ursprünglichen MKMapRect
und MKZoomScale
übergebe, die in canDrawMapRect:zoomScale:
bereitgestellt wurden. Aber ich kann auch sehen, dass das Overlay nie aufgefordert wird, diese Kachel neu zu zeichnen (weder canDrawMapRect:zoomScale:
noch drawMapRect:zoomScale:inContext:
wird jemals wieder für diese Kachel aufgerufen).
Ich muss verstehen, warum das passiert und wie man es korrigiert.
Hier ist der relevante Code aus meiner MKOverlayView-Unterklasse:
%Vor%BEARBEITEN : Ich vermute, dass dies wahrscheinlich das Problem ist.
Ich hatte ein Problem, das dem hier beschriebenen sehr ähnlich war. In meinem Fall konnte ich das gewünschte Verhalten nicht reproduzieren (beschrieben in Ссылка :) selbst mit dem einfachsten Code möglich:
%Vor%oder näher an meinem ursprünglichen Code:
%Vor%In beiden Fällen wurde setNeedsDisplayInMapRect: zoomScale: noch nie einmal aufgerufen.
Die Situation änderte sich, als ich begann, setNeedsDisplayInMapRect: zoomScale: innerhalb einer dispatch_async auszuführen, die an dieselbe Warteschlange gesendet wurde, auf der canDrawMapRect läuft, wie:
%Vor%oder mit asynchronem Job enthalten:
%Vor%Mit dispatch_async - Ich kann "Dies sollte für immer verfolgen" Zeichenfolge wird endlos verfolgt werden. Mein ursprüngliches Problem ist auch komplett verschwunden.
LATER UPDATE: Zurzeit verwende ich dispatch_get_main_queue (), um setNeedsDisplayInMapRect: zoomScale: wie
aufzurufen %Vor%Die obige Antwort hat bei mir nicht funktioniert. Aus dem NSLog-Ausdruck, den ich verwendet habe, konnte ich sehen, dass ein anderer Thread verwendet wurde, obwohl die dispatch_get_current_queue () in canDrawMapRect abgerufen und für die spätere Verwendung gespeichert wurde. Dies war zumindest im iPad 4.3 Simulator der Fall, den ich auf dem Gerät nicht versucht habe.
Meine Lösung war weniger befriedigend und mehr fehleranfällig Lösung von Warte x Zeit vor dem Aufruf.
%Vor%