如何在Swift中判断观察者是否已注册

10

我希望在观察者运行后或视图消失时将其移除。这是代码,但有时当我想再次删除它时,观察者已被删除。如何检查它是否仍然注册?

 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;
    }
}
2个回答

13
你走在正确的路上。 为你的类添加一个 isObserving 属性。当你开始观察时将它设置为 true,停止观察时将其设置为 false。在所有情况下,在开始/停止观察之前都要检查标志以确保你不处于该状态。
你还可以为属性添加一个 willSet 方法,并在该代码更改状态时开始/停止观察。

1
主要原因:addObserver() 只被调用了 1 次(在 viewDidLoad 或 init 中),但 removeObserver() 可以被调用 2 次或更多次(基于 viewWillDisappear() 被调用的次数)。
解决方法:将 addObserver() 移动到 viewWillAppear() 中。
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;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接