我最近开始发现 KVO 可以做什么,我正在重构我的一些代码并同时节省很多行。我确实面临一个如此普遍的问题,以至于我想知道是否推荐某种模式。
在某些情况下,我会加载一个新的视图控制器,该控制器需要表示来自已初始化模型的数据。我-viewDidLoad
会注册 KVO:
[_model addObserver:self
forKeyPath:kSomeKey
options:NSKeyValueObservingOptionNew
context:(__bridge void *)(_model)];
并在值更改时更改我的界面:
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if ([keyPath isEqual:kSomeKey] && context == (__bridge void *)(_model)) {
[self updateSomeInterfaceElement];
}
不幸的是,可以理解的是,当我加载新视图时,视图不会使用模型中的当前值进行更新。
-updateSomeInterfaceElement
打电话是我最好的选择-viewDidLoad
吗?这样好像没什么大不了的,但是在监听 10-20 个属性的时候,看起来效率很低(尤其是我所有的-updateSomeInterfaceElement
方法大多只有 1 行,所以没必要把它们做成单独的方法)。有什么办法可以规避这个问题,还是有更优雅的解决方案?