Swift使用willMoveToSuperview管理KVO

通过视图的 willMoveToSuperview 方法来管理 KVO,算是个挺实用的小技巧,尤其在你不想手动到处 add/remove 的时候。

用 UIView 的生命周期来自动绑定和解绑观察者,能让你省不少心。你只需要在视图即将添加或移除父视图的时候 KVO 注册和注销,响应也快,代码也清爽不少。

像下面这样写,逻辑就蛮清楚的:

override func willMove(toSuperview newSuperview: UIView?) {
  super.willMove(toSuperview: newSuperview)
  if newSuperview != nil {
    self.addObserver(self, forKeyPath: "someProperty", options: .new, context: nil)
  } else {
    self.removeObserver(self, forKeyPath: "someProperty")
  }
}

,KVO 在 Swift 里本身就不是那么直觉,主要是类型安全比较严格,稍不注意就容易崩。你要记得配合使用 context 来避免观察者冲突,还要注意别漏了注销,不然内存泄露跑不了。

想看具体例子的话,可以顺手翻下Swift KVO 使用案例这篇,代码比较干净,新手看也不难懂。

如果你项目里有用到模型驱动 UI、动画联动或者状态监听,KVO 还是挺好用的。要是你对 Combine 比较熟,也可以考虑换成那一套,更 Swifty 一点。

,如果你有自定义视图组件,想省事又不想放弃 KVO,这种写法还挺值得一试的。

zip
swift-通过willMoveToSuperview的无忧的使用KVO.zip 预估大小:27个文件
folder
KVO-Demo-master 文件夹
file
.gitignore 1KB
folder
willMoveToSuperview的使用UITests 文件夹
file
willMoveToSuperview___UITests.m 1KB
file
Info.plist 701B
file
LICENSE 1KB
file
.DS_Store 6KB
file
README.md 2KB
folder
willMoveToSuperview的使用 文件夹
file
main.m 347B
file
ViewController.m 1KB
file
AppDelegate.h 290B
file
ObserverView.h 263B
file
Info.plist 1KB
file
AppDelegate.m 2KB
file
QSLabel.m 2KB
file
TestViewController.m 1KB
file
TestViewController.h 234B
file
ObserverView.m 1KB
file
ViewController.h 228B
folder
Base.lproj 文件夹
file
LaunchScreen.storyboard 2KB
file
QSLabel.h 202B
folder
Assets.xcassets 文件夹
folder
AppIcon.appiconset 文件夹
file
Contents.json 1KB
folder
willMoveToSuperview的使用.xcodeproj 文件夹
folder
project.xcworkspace 文件夹
file
contents.xcworkspacedata 188B
folder
xcuserdata 文件夹
folder
qson.xcuserdatad 文件夹
file
UserInterfaceState.xcuserstate 33KB
file
project.pbxproj 24KB
folder
xcuserdata 文件夹
folder
qson.xcuserdatad 文件夹
folder
xcschemes 文件夹
file
xcschememanagement.plist 351B
folder
xcdebugger 文件夹
file
Breakpoints_v2.xcbkptlist 2KB
folder
willMoveToSuperview的使用Tests 文件夹
file
Info.plist 701B
file
willMoveToSuperview___Tests.m 815B
zip 文件大小:41.67KB