2013-01-21 10 views
5

Ho riscontrato un problema di prestazioni relativo all'aggiunta di annotazioni alle mappe in iOS (utilizzando i metodi standard mapkit, quindi utilizzando le mappe Apple). Sto cercando di aggiungere un gran numero di annotazioni (10000+) alla rinfusa, usando il metodo (void)addAnnotations:(NSArray *)annotations. Gli oggetti di annotazione sono niente di speciale - una classe molto semplice che implementa MKAnnotation solo con il costruttore definiti come segue:L'aggiunta di annotazioni a una mappa è troppo lenta - iOS

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

    return self; 
} 

Al fine di testare, ho creato un app di base che aggiunge semplicemente le annotazioni a una mappa di base vista sul carico, e richiede circa 6-7 secondi su un iPad 2. Prestazioni molto accettabili. Tuttavia, le cose si complicano quando incorporo la stessa vista di base della mappa nella mia applicazione. È esattamente la stessa logica, ma quando lo faccio nella mia app, ci vogliono circa 50 secondi per caricare tutte le annotazioni.

La mia app ha una serie di viste l'una nell'altra. Per individuare il problema, ho iniziato a incorporare la visualizzazione della mappa a partire dal livello più basso, fino a raggiungere il livello più alto. Ho eseguito il profiling in ogni fase per vedere se questo aiuta le prestazioni, ma non vedo alcun risultato - sono ancora circa 50 secondi. In questo momento, la mia app in pratica carica e aggiunge le annotazioni alla vista mappa superiore e solo a livello, idealmente uguale all'app standalone, ma per qualsiasi motivo, vedo ancora il rendering dell'annotazione in circa 50 secondi. L'unica spiegazione ragionevole che ho è in merito ad alcune delle impostazioni dell'app che ho in qualche modo interferisce con le prestazioni della mappa. Ho fatto un sacco di letture per trovare una soluzione senza successo.

Qualcuno ha qualche idea su quale potrebbe essere il problema qui? Grazie!

+0

Grande domanda e profondità/dettaglio. Sfortunatamente non conosco la risposta, ma per una domanda per la prima volta su StackOverflow devo applaudire! – MCKapur

+0

Non ho giocato molto con MapKit, ma qui ci sono 2 opzioni possibili: 1) Prova a farlo in un thread bg (non sono sicuro che funzioni). 2) Carica solo annotazioni che abbiano senso in uno zoom definito. Quindi, se stai zumando molto, ne fai solo uno per mostrare 20, una volta ingrandito, il numero di annotazioni possibili sarà inferiore a 10k, quindi mostra le 20 successive più importanti che intersecano la tua vista corrente ... e così via. – LocoMike

risposta

0

Nessun "problema" effettivo. Voglio dire, hai più di 10000 allocazioni, estrazioni e rendering che stanno avendo un impatto sulle prestazioni dell'applicazione.

Il mio suggerimento è di intercettare la navigazione dell'utente sulla mappa. Usa qualcosa come [mapView visibleMapRect] per ottenere la parte visibile della mappa sullo schermo. Ottieni le coordinate del rect (forse un po 'più grande in modo che non possa essere notato dall'utente quando si sposta la mappa) e carichi solo le annotazioni all'interno di quel rettangolo.

Mentre l'utente si sposta, è sufficiente caricare le annotazioni che si trovano all'interno del nuovo rettangolo MENO le annotazioni che erano già state caricate nel rettangolo precedente. Immagino che tu possa anche rimuovere l'annotazione quando escono dallo schermo.

Questo assomiglia un po 'a quello che Apple suggerisce di fare quando si tratta di visualizzazioni a scorrimento. Ricordo l'applicazione in cui l'utente avrebbe dovuto caricare il contenuto della sezione precedente e successiva della scrollview (e di rilasciare il contenuto della precedente visualizzazione 1) in modo da avere un consumo di memoria lento e mantenere comunque una buona esperienza utente .

Prova a pensare a ciò che l'utente sta guardando, prova a mostrare solo le annotazioni che contano quella porzione (o regione come vengono chiamate nel gergo di MKMapView) e penso che la reattività dell'app migliorerà appena.

Problemi correlati