2014-03-31 10 views
10

Ich versuche, den neuen iOS7 MKMapSnapshotter zu verwenden, um ein statisches Kartenbild zu generieren. Immer wenn meine App eine Karte benötigt, rufe ich Folgendes an:iOS MKMapShapshotter Abschlussblock wird nicht immer aufgerufen

MKMapSnapshotter *snapshotter = [[[MKMapSnapshotter alloc] initWithOptions:theOptions] autorelease]; 
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0); 
DebugLog(@"Snapshotter allocated %@ and run on queue %@", snapshotter, aQueue); 

[snapshotter startWithQueue:aQueue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) { 
    DebugLog(@"Snapshotter completion block %@", snapshotter); 
    // perform selector on main thread to set self.imageView.image = shanpshot.image; 
} 

In den meisten Fällen funktioniert das großartig. Manchmal scheint es jedoch, dass das Gerät mit Anfragen nach Karten überlastet wird und dann das Rendern aufhört. In meiner Protokolldatei sehe ich die erste Log-Anweisung über den zugewiesenen "Snapshot", sehe aber nie die "Snapshot-Vervollständigungsblock" -Nachricht.

Ist es möglich, dass meine Anfragen nie aus der Dispatch Queue ausgeführt werden? Hat jemand dieses Problem jemals gehabt?

+0

Haben Sie eine Lösung gefunden? Ich habe das gleiche Problem:/ –

+0

haben Sie versucht mit - (void) startWithCompletionHandler: (MKMapSnapshotCompletionHandler) completionHandler? –

+0

Ich würde damit beginnen, eine dedizierte Warteschlange für Ihre Snapshotter-Instanz zu erstellen. Wenn dies zuverlässig gelöst wird, haben Sie möglicherweise die globale Hintergrundwarteschlange an einer anderen Stelle in Ihrer App blockiert. – nzeltzer

Antwort

0

Dieses Problem tritt wahrscheinlich auf, da snapshotter keine Eigenschaft ist und daher bald nach dem Verlassen dieses Bereichs automatisch freigegeben wird. Wenn Sie Snapshotter als Eigenschaft beibehalten, sollte dies behoben werden.

2

Dies ist (oder scheint) ein Fehler in MKMapSnapshotter.

Wenn Netzwerkdaten und WiFi ausgeschaltet sind, die Abschluss-Handler nicht aufgerufen werden (es sei denn, es Daten in dem O zwischengespeichert werden - siehe https://stackoverflow.com/a/5769108/481207 den Cache für das Clearing).

Tatsächlich scheint der Snapshotter das Warten auf Daten zu blockieren. Es gibt keine Zeitüberschreitung oder erkennen, dass keine Daten vorhanden sind. Nach vielen Minuten, z.B. 15 Minuten, snapshotter.isLoading = YES. Der Aufruf von cancel bewirkt nicht, dass der Beendigungshandler aufgerufen wird.

Wenn WLAN- oder Netzwerkdaten wieder aktiviert werden, rufen nachfolgende Aufrufe zum Starten eines (neuen) Snapshotters den Beendigungshandler auf.

Dies ist schlecht, wenn eine Variable gesetzt wird, wenn der Snapshotter im Handler gestartet und gelöscht wird, weil die Variable niemals gelöscht wird.

if (!isRendering) { 
    isRendering = YES; 

    [snapshotter startWithCompletionHandler: 
    ^(MKMapSnapshot* snapshot, NSError* error) { 
     // This may not be called so this code will 
     // never run again. 
     isRendering = NO; 
    }]; 
} 
0

Hatte das gleiche Problem in verschiedenen iOS-Versionen. Der Punkt war, dass die AppleMaps App die Karten auch nicht richtig geladen hat. Neustart des Geräts hat es funktioniert. Ich nehme an, es ist ein Apple Bug.

0

Ich habe das gleiche Problem. Der Grund war in MKMapSnapshotOptions, wo ich eine sehr kleine Region eingestellt habe. Ich setze Standardwerte für Delta Länge und Delta Breite als 0,05. Jetzt funktioniert es.

Verwandte Themen