2015-04-11 17 views
6

Voglio rimuovere un osservatore dopo averlo eseguito o quando la vista è scomparsa. Ecco il codice, ma a volte l'osservatore è stato già rimosso quando voglio rimuoverlo di nuovo. Come verificare se è ancora registrato?Come ottenere se un osservatore è registrato in Swift

override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { 
    if(!didOnce){ 
     if(keyPath == "myLocation"){ 
      location = mapView.myLocation.coordinate; 

      self.mapView.animateToLocation(self.location!); 
      self.mapView.animateToZoom(15); 
      didOnce = true; 
      self.mapView.removeObserver(self, forKeyPath: "myLocation"); 
     } 
    } 
} 
override func viewDidAppear(animated: Bool) { 
    didOnce = false; 
} 
override func viewWillDisappear(animated: Bool) { 
    if(!didOnce){ 

     self.mapView.removeObserver(self, forKeyPath: "myLocation"); 
     didOnce = true; 
    } 
} 

risposta

10

Sei sulla strada giusta. Aggiungi una proprietà isObserving alla tua classe. Impostalo su true quando inizi a osservare e impostalo su false quando smetti di osservare. In tutti i casi controlla la bandiera prima di iniziare/interrompere l'osservazione per assicurarti di non essere già in quello stato.

È anche possibile aggiungere un metodo willSet alla proprietà e fare in modo che il codice inizi/smonti di osservare quando la proprietà cambia stato.

Problemi correlati