情景
今天用到第三方的一个兼容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];
}
总结: