2013-04-18 3 views
1

J'utilise un sous-classé MKOverlay et sous-classé MKOverlayView pour afficher les tuiles WMS. Ça fonctionne bien.Supprimer un MKOverlayView personnalisé

Je suis confronté à la question de supprimer le MKOverlayView lorsque j'ai fini d'afficher les tuiles. Je peux enlever le MKOverlay très bien:

-(void)removeWMSOverlay {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      MKOverlayView *test = [self.mapView viewForOverlay:overlay]; 

      [self.mapView removeOverlay:overlay]; 
     } 
    } 
} 

Mais le WMSOverlayView est toujours là et toujours en cours d'exécution de son code (constamment vérifier si de nouvelles tuiles peuvent être tirer) qui crée un certain décalage.

Je ne sais pas où trouver une liste de MKOverlayViews qui sont actifs. J'ai essayé:

-(void)removeWMSOverlay {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      MKOverlayView *test = [self.mapView viewForOverlay:overlay]; 

      [self.mapView removeOverlay:overlay]; 

      [test removeFromSuperview]; 

      test = nil; 
     } 
    } 
} 

sans aucun effet. Le code est toujours en cours d'exécution.

Même essayé de garder une référence autour de zéro:

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    if ([overlay isKindOfClass:[WMSOverlay class]]) { 

     WMSOverlayView *view = [[WMSOverlayView alloc] initWithOverlay:overlay]; 
     view.alpha = .8; 

     self.wmsOverlayView = view; 

     return view; 
    } 

    return FALSE; 
} 

-(void)removeScene {  
    for (WMSOverlay *overlay in self.mapView.overlays) { 
     if ([overlay isKindOfClass:[WMSOverlay class]]) {    
      [self.mapView removeOverlay:overlay]; 

      self.wmsOverlayView = nil; 
     } 
    } 
} 

Puis-je supprimer le MKOverlayView ou dois-je comprendre comment réutiliser la vue?

EDIT:

J'ai essayé réutilisant le MKOverlayView:

else if ([overlay isKindOfClass:[WMSOverlay class]]) { 
    self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay]; 

    return self.wmsOverlayView; 
} 

et ajouté une minuterie pour montrer que plus d'un MKOverLayView runing:

-(void)amIStillHere { 
    DLog("I'M STILL RUNNING | self: %@", self); 
} 

Ils ne sont pas réutilisés ou partez:

DEBUG | -[WMSOverlayView startTimer] | I'M STILL RUNNING | self: <WMSOverlayView: 0x1d84afe0; frame = (6.02801e+07 9.44092e+07; 2.30324e+06 2.10344e+06); opaque = NO; layer = <MKOverlayClusterProxyLayer: 0x21bf3ff0>> 
DEBUG | -[WMSOverlayView startTimer] | I'M STILL RUNNING | self: <WMSOverlayView: 0x21be1a80; frame = (6.06487e+07 9.2838e+07; 2.36776e+06 2.15038e+06); opaque = NO; layer = <MKOverlayClusterProxyLayer: 0x1d8e2a20>> 

Répondre

0

Curieux, j'ai ajouté le NSCacheDelegate pour voir quand un élément est expulsé (J'étais inquiet d'avoir un NSCache pour chaque WMSOverlayView et comment ils se comporteraient et l'utilisation de la mémoire, j'ai mis le cache à 32mb et je ne veux pas engloutir tous Mémoire). J'ai essayé de nommer chaque cache pour voir s'il y avait deux caches, je pouvais voir si l'ancien cache était effacé pour faire de la place dans la mémoire pour le nouveau cache. Chaque cache a été réalisé toujours le même nom:

-(MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id <MKOverlay>)overlay { 
    if (self.wmsOverlayView == nil) { 
     self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay withCacheName:@"CACHE!"]; 
    } 
    else { 
     self.wmsOverlayView = [[WMSOverlayView alloc] initWithOverlay:overlay withCacheName:@"THE NEW BETTER CACHE!"]; 
    } 

    return self.wmsOverlayView; 
} 

J'ai aussi remarqué que self.wmsOverlayView était toujours nil et nommant toujours le cache CACHE !. Ainsi, le wmsOverlayView est supprimé lorsque la superposition est supprimée. Mais mon minuteur continuait à partir. J'ai donc refacturé mon code pour enlever le minuteur et quand j'ai enlevé le WMSOverlay, le cache a été effacé (j'ai obtenu mon cache:willEvictObject: spammé NSLog). Donc je crois que le minuteur gardait le WMSOverlayView en vie.

Morale de l'histoire: ne pas placer une minuterie dans un MKOverlayView.

Questions connexes