Ios 如何获取观察员是否已在Swift中注册

Ios 如何获取观察员是否已在Swift中注册,ios,swift,Ios,Swift,我想在观察者运行后或视图消失时删除它。下面是代码,但有时当我想再次删除它时,观察者已经被删除了。如何检查它是否仍然注册 override func observeValueForKeyPath(keyPath: String, ofObject object: AnyObject, change: [NSObject : AnyObject], context: UnsafeMutablePointer<Void>) { if(!didOnce){ if(k

我想在观察者运行后或视图消失时删除它。下面是代码,但有时当我想再次删除它时,观察者已经被删除了。如何检查它是否仍然注册

 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;
    }
}
override func observeValueForKeyPath(键路径:String,of对象对象:AnyObject,change:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果(!didOnce){
如果(键路径==“myLocation”){
位置=mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce=真;
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
}
}
}
覆盖功能视图显示(动画:Bool){
didOnce=false;
}
覆盖功能视图将消失(动画:Bool){
如果(!didOnce){
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
didOnce=真;
}
}

你走对了方向。将
属性添加到类中。开始观察时将其设置为true,停止观察时将其设置为false。在所有情况下,在开始/停止观察之前检查标志,以确保您尚未处于该状态

您还可以向属性添加一个willSet方法,并让该代码在属性更改状态时开始/停止观察。

主要原因:addObserver()被调用1次(在viewDidLoad或init中),但removeObserver()可以被调用2次或更多次(基于调用ViewWillEvale()的次数)

要解决此问题,请将addObserver()移动到viewWillDisplay():

private var didOnce=false
覆盖函数视图将出现(uo动画:Bool){
超级。视图将显示(动画)
self.mapView.addObserver(self,forKeyPath:“myLocation”,选项:。新建,上下文:nil)
}
重写func observeValueForKeyPath(键路径:字符串,对象对象:AnyObject,更改:[NSObject:AnyObject],上下文:UnsafeMutablePointer){
如果(!didOnce){
如果(键路径==“myLocation”){
位置=mapView.myLocation.coordinate;
self.mapView.animateToLocation(self.location!);
self.mapView.animateToZoom(15);
didOnce=真;
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
}
}
}
覆盖功能视图将消失(动画:Bool){
如果(!didOnce){
self.mapView.removeObserver(self,forKeyPath:“myLocation”);
didOnce=真;
}
}
private var didOnce = false

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.mapView.addObserver(self, forKeyPath: "myLocation", options: .new, context: nil)
}

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 viewWillDisappear(animated: Bool) {
    if(!didOnce){
        self.mapView.removeObserver(self, forKeyPath: "myLocation");
        didOnce = true;
    }
}