2013-01-21 15 views
5

Mam problem z wydajnością związany z dodawaniem adnotacji do map w systemie iOS (przy użyciu standardowych metod mapowania - stąd używanie map Apple). Próbuję dodać dużą liczbę adnotacji (10000+) luzem, używając metody (void)addAnnotations:(NSArray *)annotations. Obiekty adnotacji to nic specjalnego - bardzo podstawowe klasy, która implementuje MKAnnotation tylko konstruktora zdefiniowane następująco:Dodawanie adnotacji do mapy jest zbyt wolne - iOS

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

    return self; 
} 

W celu sprawdzenia, jakie stworzył podstawową aplikację, która po prostu dodaje adnotacje do podstawowego mapie widok na obciążenie i zajmuje około 6-7 sekund na iPadzie 2. Bardzo akceptowalna wydajność. Jednak rzeczy komplikują się, gdy umieszczam ten sam podstawowy widok mapy w mojej własnej aplikacji. Jest to dokładnie ta sama logika, ale kiedy robię to w mojej aplikacji, ładowanie wszystkich adnotacji zajmuje około 50 sekund.

Moja aplikacja ma wiele widoków w sobie. Aby dokładnie zidentyfikować problem, zacząłem umieszczać widok mapy od najniższego poziomu, aż osiągnę najwyższy poziom. Zrobiłem profilowanie na każdym kroku, aby sprawdzić, czy to pomaga w osiągach, ale nie widzę żadnych wyników - nadal trwa to około 50 sekund. Obecnie moja aplikacja po prostu ładuje i dodaje adnotacje do najwyższego i jedynego widoku mapy poziomu, idealnie takiego samego jak aplikacja autonomiczna, ale z dowolnego powodu nadal widzę renderowanie adnotacji trwające około 50 sekund. Jedyne rozsądne wyjaśnienie, jakie mam, dotyczy niektórych ustawień aplikacji, które mam w jakiś sposób kolidują z wydajnością mapy. Zrobiłem kilka lektur, żeby wymyślić rozwiązanie bezskuteczne.

Ktoś ma jakieś pomysły na temat tego, co może być tutaj problemem? Dzięki!

+0

Świetne pytanie i głębokość/szczegóły. Niestety nie znam odpowiedzi, ale dla pierwszego pytania na temat StackOverflow muszę cię oklaskiwać! – MCKapur

+0

Nie grałem dużo MapKit, ale tutaj są 2 możliwe opcje: 1) Spróbuj zrobić to w wątku bg (nie jestem pewien, czy to zadziała). 2) Ładuj tylko adnotacje, które będą miały sens w zdefiniowanym powiększeniu. Więc jeśli yo jest bardzo pomniejszony, tylko jeden może pokazać 20, a po powiększeniu liczba możliwych adnotacji będzie mniejsza niż 10k, więc pokaż następne 20 ważniejszych, które przecinają bieżącą rzutnię ... i tak dalej. – LocoMike

Odpowiedz

0

Nie ma faktycznego "problemu". Mam na myśli, że masz ponad 10000 alokacji, rysunków i renderingów, które mają wpływ na wydajność aplikacji.

Moja sugestia to przechwycenie nawigacji użytkownika na mapie. Użyj czegoś takiego, jak [mapView visibleMapRect], aby uzyskać widoczną część mapy na ekranie. Uzyskaj współrzędne prostokąta (być może trochę większe, aby użytkownik nie zauważył podczas przesuwania mapy) i załaduj tylko adnotacje w tym prostokącie.

Podczas przenoszenia użytkownik musi tylko załadować adnotacje, które są w nowym prostym MINUS adnotacje, które zostały już załadowane w poprzednim rect. Przypuszczam, że możesz także usunąć adnotację, gdy znikną z ekranu.

To trochę przypomina to, co sugeruje Apple w przypadku przewijania widoków. Pamiętam aplikację, w której użytkownik musiałby załadować zawartość poprzedniej i następnej sekcji przewijania (i zwolnić zawartość widoku poprzedniej-1), aby mieć wolne zużycie pamięci i nadal utrzymywać dobre wrażenia użytkownika .

Staraj się myśleć o tym, na co patrzy użytkownik, spróbuj pokazać tylko adnotacje, które są ważne dla tej części (lub regionu, jak są one wywoływane w żargonie MKMapView) i myślę, że Twoja reakcja na aplikację poprawi się od razu.

Powiązane problemy