繁体   English   中英

Swift Observer (KVO):检查是否存在

[英]Swift Observer (KVO): Checking for Existence

我有一个用户可以平移的盒子。 为此,我添加了一个观察者来检查它的中心是否发生了变化:

self.boxView!.addObserver(self, forKeyPath: "center", options: .old, context: &BoxCenterContext)

这是在呈现框的动画之后添加的。

当框解散时,我将其删除如下:

self.boxView!.removeObserver(self, forKeyPath: "center", context: &BoxCenterContext)

问题

存在用户能够在框呈现完成之前关闭框的可能性,即。 在添加 KVO 之前。

发生这种情况时,应用程序会在尝试删除不存在的 KVO 时崩溃。

有没有办法检查 KVO 的存在(在尝试删除之前)?

当添加观察者时设置observationInfo属性

if self.boxView!.observationInfo != nil {

   self.boxView!.removeObserver(self, forKeyPath: "center", context: &BoxCenterContext) 
}

Apple 不提供任何用于检查观察者是否存在的 API,但您可以为此管理 Bool 标志。 就像当您注册 KVO 时,您将 isObserver bool 设置为 true,然后在删除观察者之前,您需要检查 isObserver 是否为 true,如果 isObserver 为 true,则删除观察者,如果它为 false,则不要做任何事情。

使用这个扩展

extension NSObject {
  func safeRemoveObserver(_ observer: NSObject, forKeyPath keyPath: String) {
    switch self.observationInfo {
    case .some:
      self.removeObserver(observer, forKeyPath: keyPath)
    default:
      debugPrint("observer does no not exist")
    }
  }
}

根据Apple doc观察者删除代码应该包装在 @try @catch 块中,因为没有 API 来检查特定对象是否是观察者。 例如(请原谅我的目标 c):

    @try {
        [self.event removeObserver:self forKeyPath:@"eventTimeZone"];
    } @catch (NSException *exception) {
        NSLog(@"Tried to remove observer from event, but there was no observer anymore.");
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM