ios -KVO的简单使用小记

情景

     今天用到第三方的一个兼容webView与wkwebView的时候,对于IMYwebview中的属性estimatedProgress这个float值动态变化监听从而实现进度条加载的变化效果.

小介绍:

     键值观察协议时朝着自动化如上过程方向的一个很大进步。在很多情况下,广播者不需要做任何事情。

每个Cocoa对象自动处理用于发布任何对象的addObserver:forKeyPath:options:context:。如果广播者的 “setter”方法遵循某些规则,“setter”方法就会自动触发任何监听者的 observeValueForKeyPath:ofObject:change:context:方法。

例如如下代码就会在“source”对象上加入一个观察者::

[source      addObserver:destination      forKeyPath:@"myValue"     options:NSKeyValueChangeNewKey      context:nil];

这样在每次调用setMyValue:方法的时候都会发送一个observeValueForKeyPath:ofObject:change:context:消息到destination。

你所需要做的就是在被观察对象上注册监听者并让监听者实现observeValueForKeyPath:ofObject:change:context:。

优点: 内置的而且是自动的。可以观察任何键路径。支持依赖通知。

缺点: 广播者无法知道谁在监听。方法必须符合命名规则以实现自动观察消息的运作。监听者必须在被删除之前被移除,否者接下来的通知就会导致崩溃和失效-不过这对于该文中指出的所有方法都是一样的。


//实际运用

//1.为webContentView这个类添加观察者

[webContentView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];

//2.添加观察者属性变化执行的方法(必须实现)这个方法是在观察的属性发生变化时便会触发

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void *)context{

if (webContentView.estimatedProgress == 0.0) {

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;

progressView.progress = 0;

[UIView animateWithDuration:0.27 animations:^{

progressView.alpha = 1.0;

}];

}

if (webContentView.estimatedProgress == 1.0) {

[UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

[UIView animateWithDuration:0.27 delay:webContentView.estimatedProgress - progressView.progress options:0 animations:^{

progressView.alpha = 0.0;

} completion:nil];

}

[progressView setProgress:webContentView.estimatedProgress animated:NO];

}

//3.移除观察者(不移除的话很可能造成崩溃)

- (void)dealloc{

[webContentView removeObserver:self forKeyPath:@"estimatedProgress" context:nil];

}

总结:

你可能感兴趣的:(ios -KVO的简单使用小记)