2013-01-21 8 views
5

Ich habe ein Leistungsproblem in Bezug auf das Hinzufügen von Anmerkungen zu Karten in iOS (mit den Standard-Mapkit-Methoden - daher mit Apple-Karten). Ich versuche, eine große Anzahl von Annotationen (10000+) in großen Mengen hinzuzufügen, unter Verwendung der (void)addAnnotations:(NSArray *)annotations Methode. Die Beschriftungsobjekte sind nichts Besonderes - eine sehr einfache Klasse, die MKAnnotation mit nur den Konstruktor implementiert wie folgt definiert:Hinzufügen von Anmerkungen zu einer Karte sind zu langsam - iOS

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d { 
    if(self = [super init]) { 
     title = ttl; 
     coordinate = c2d; 
    } 

    return self; 
} 

Um zu testen, habe ich eine grundlegende App erstellt, die die Anmerkungen zu einer Basiskarte fügt einfach Blick auf Last, und es dauert etwa 6-7 Sekunden auf einem iPad 2. Sehr akzeptable Leistung. Die Dinge werden jedoch kompliziert, wenn ich dieselbe grundlegende Kartenansicht in meine eigene Anwendung einbette. Es ist die exakt gleiche Logik, aber wenn ich es in meiner App mache, dauert es etwa 50 Sekunden, um alle Anmerkungen zu laden.

Meine App hat eine Reihe von Ansichten ineinander. Um das Problem zu lokalisieren, habe ich begonnen, die Kartenansicht von der untersten Ebene bis zur obersten Ebene einzubetten. Ich habe in jedem Schritt Profiling durchgeführt, um zu sehen, ob es der Leistung hilft, aber ich sehe keine Ergebnisse - es sind immer noch rund 50 Sekunden. Im Moment lädt und fügt meine App die Annotationen nur in die oberste und einzige Level-Map-Ansicht ein, idealerweise die selbe wie die Standalone-App, aber aus welchen Gründen auch immer, ich sehe immer noch, dass das Annotation-Rendering ungefähr 50 Sekunden dauert. Die einzige vernünftige Erklärung, die ich habe, betrifft einige meiner App-Einstellungen, die die Kartenleistung beeinträchtigen. Ich habe eine Menge gelesen, um ohne Erfolg eine Lösung zu finden.

Wer hat irgendwelche Ideen, woran das Problem liegen könnte? Vielen Dank!

+0

Große Frage und Tiefe/Detail. Leider kenne ich die Antwort nicht, aber für eine First-Timer-Frage zu StackOverflow muss ich dich applaudieren! – MCKapur

+0

Ich habe nicht viel MapKit gespielt, aber hier sind 2 mögliche Optionen: 1) Versuche es in einem bg-Thread (nicht sicher, ob es funktioniert). 2) Laden Sie nur Annotationen, die in einem definierten Zoom sinnvoll sind. Wenn Sie also sehr verkleinert sind, können Sie nur einen Wert von 20 anzeigen. Wenn Sie zoomen, beträgt die Anzahl der möglichen Beschriftungen weniger als 10k. Zeigen Sie also die nächsten 20 wichtigeren Werte an, die das aktuelle Ansichtsfenster schneiden ... und so weiter. – LocoMike

Antwort

0

Es gibt kein tatsächliches "Problem". Ich meine, Sie haben mehr als 10.000 Zuweisungen, Ziehungen und Renderings, die sich tatsächlich auf die Leistung der Anwendung auswirken.

Mein Vorschlag ist es, die Benutzer-Navigation auf der Karte abzufangen. Verwenden Sie etwas wie [mapView visibleMapRect], um den sichtbaren Teil der Karte auf dem Bildschirm zu erhalten. Holen Sie sich die Koordinaten des rect (vielleicht ein wenig größer, damit der Benutzer sie beim Verschieben der Karte nicht bemerken kann) und laden Sie nur die Annotationen innerhalb dieses rect.

Während der Benutzer bewegt, müssen Sie nur die Anmerkungen laden, die innerhalb der neuen rect MINUS die Anmerkungen sind, die bereits in der vorherigen Rect geladen wurden. Ich denke, Sie können die Anmerkung auch entfernen, wenn sie den Bildschirm verlassen.

Dies ähnelt ein wenig, was Apple vorschlägt, wenn es um Scroll-Ansichten geht. Ich erinnere mich an die Anwendung, in der der Benutzer den Inhalt des vorherigen und nächsten Abschnitts der Scrollview laden musste (und den Inhalt der vorherigen 1-Ansicht freigeben), um einen langsamen Speicherverbrauch zu haben und trotzdem eine gute Benutzererfahrung zu behalten .

Versuchen Sie, darüber nachzudenken, was der Benutzer gerade anschaut, versuchen Sie, nur die Anmerkungen zu zeigen, die diesen Teil (oder die Region, wie sie im MKMapView-Jargon genannt werden) darstellen, und die Reaktionsfähigkeit Ihrer App wird sich sofort verbessern.

Verwandte Themen