[英]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.