2012-07-30 26 views
7

Como no se llama a - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView cuando se cargan las teselas desde la memoria caché, ¿hay alguna forma de saber cuándo se han cargado todas las teselas (ya sea desde la memoria caché o desde los servidores de asignación)?Detectando cuando se muestran mosaicos MapView

¿Hay alguna delegación que sugiera que las teselas se han cargado?

+2

he presentado de Apple Bug # 13774496 relacionado con este y ha creado una aplicación ejemplo para demostrar el problema todavía existe en iOS6: https://github.com/iwasrobbed/MapKitDelegateBug – iwasrobbed

Respuesta

4

Aquí hay un código fuente que escribí:https://github.com/jonathanlking/mapViewTest

¿Por qué no se piensa en el problema como éste;

Cuando cambie la vista del mapa, se llamará mapView:regionDidChangeAnimated:.

A partir de allí se llamará mapViewWillStartLoadingMap:.

Se llamará a mapViewDidFailLoadingMap:withError: o si las teselas se han obtenido del servidor.

Sin embargo, si no se llama a ninguno de ellos, puede suponer que los mosaicos se están cargando desde la memoria caché.

+2

Gracias pero todavía no hay manera de saber cuándo se muestran. –

+0

Se muestran al instante, ya que están almacenados en caché. –

+2

Lo siento, pero esto no funciona. Eliminé la conexión a Internet en mi iPod Touch y amplié hasta un nivel en el que no había mosaicos almacenados en caché, y todavía indica que el mapa terminó de cargarse correctamente (desde la caché en su ejemplo). Este es un error por parte de Apple. – iwasrobbed

2

Como se mencionó, mapViewDidFinishLoadingMap a veces no se llama en absoluto, especialmente si las teselas del mapa ya están en la memoria caché, y algunas veces se llama varias veces.

Me di cuenta de que cuando se llama varias veces en la última llamada se procesan todas las teselas. Así que creo que puede hacer que esto funcione si configura un temporizador de 2 segundos después de que el mapa comience a cambiar. Desactive las interacciones para que el mapa no continúe cambiando y habilite las interacciones del usuario cuando el temporizador se apaga.

Si se llama a mapViewDidFinishLoadingMap reinicie el temporizador de nuevo durante 2 segundos en el futuro. Cuando el temporizador finalmente se apaga, debes tener un mapa completamente renderizado.

Querrá considerar las otras devoluciones de llamada como mapViewDidFailLoadingMap. Pruebe también esto en una conexión ruidosa, ya que 2 segundos pueden no ser lo suficientemente largos si lleva mucho tiempo recuperar las fichas.

- (void)restartTimer 
{ 
    [self.finishLoadingTimer invalidate]; 
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0 
                   target:self 
                  selector:@selector(mapLoadingIsFinished) 
                  userInfo:nil 
                   repeats:NO]; 
} 

- (void)mapLoadingIsFinished 
{ 
    self.finishLoadingTimer = nil; 
    self.mapChanging = NO; 
    self.view.userInteractionEnabled = YES; 
} 

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView 
{ 
    if (self.mapChanging) { 
     [self restartTimer]; 
    } 
} 

- (void)startLookingForMapChange 
{ 
    assert(self.mapChanging == NO); 
    if (self.mapChanging == NO) { 
     self.mapChanging = YES; 
     assert(self.finishLoadingTimer == nil); 
     self.view.userInteractionEnabled = NO; 
     [self restartTimer]; 
    } 
} 
+0

Esto no funciona en el caso de que haya perdido la conexión a Internet por lo que no puede cargar más teselas. Todavía llama al delegado diciendo que el mapa se ha cargado por completo. – iwasrobbed

Cuestiones relacionadas