BinBear's Blog

There is no royal road to learning.


  • 首页

  • 分类

  • 归档

  • 标签

  • 搜索
close

谈谈代理优化

发表于 2016-07-15   |   分类于 iOS随笔

协议(protocol)

协议是OC的一项特性,与Java的“接口”类似。我们都知道OC不支持多继承,所以我们可以把某个类要实现的一系列方法定义在协议里面。而协议最常见的用途是实现委托模式。

委托模式

委托模式是一种编程设计模式,iOS中用它来实现对象间的通信。委托模式定义一套接口,某个对象若想接受另一个对象的委托,则需遵从此接口,以便成为其“委托对象”。另一个则可以给其委托对象回传一些信息,也可以发生相关事件时通知委托对象。

委托模式可以将数据与业务逻辑解耦。在整个Cocoa系统框架中,一般都是用协议这项特性来实现此模式。简单举个例子。

我们都知道iOS8之后推出了WKWebView来替代UIWebView。WKWebView相比UIWebView有更优越的性能,可是对于要兼容iOS7的项目来说,却无能为力。但是我们却可以自定义一个webview,iOS8以上用WKWebView,iOS8以下用UIWebView。利用运行时来判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
if(NSClassFromString(@"WKWebView")) {
self.wkWebView = [[WKWebView alloc] init];
} else {
self.uiWebView = [[UIWebView alloc] init];
}
self.backgroundColor = [UIColor redColor];
if(self.wkWebView) {
[self.wkWebView setFrame:frame];
[self.wkWebView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[self.wkWebView setNavigationDelegate:self];
[self.wkWebView setUIDelegate:self];
[self.wkWebView setMultipleTouchEnabled:YES];
[self.wkWebView setAutoresizesSubviews:YES];
[self.wkWebView.scrollView setAlwaysBounceVertical:YES];
[self addSubview:self.wkWebView];
[self.wkWebView addObserver:self forKeyPath:NSStringFromSelector(@selector(estimatedProgress)) options:0 context:FTDIntegrationWebBrowserContext];
[self.wkWebView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:NULL];
} else {
[self.uiWebView setFrame:frame];
[self.uiWebView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[self.uiWebView setDelegate:self];
[self.uiWebView setMultipleTouchEnabled:YES];
[self.uiWebView setAutoresizesSubviews:YES];
[self.uiWebView setScalesPageToFit:YES];
[self.uiWebView.scrollView setAlwaysBounceVertical:YES];
[self addSubview:self.uiWebView];
}

有了webview,但是由于WKWebView和UIWebView有不同的代理方法,这时我们就可以用协议来解决这个问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@protocol FTDIntegrationWebViewDelegate <NSObject>
@optional
/**
* webview内容的标题
*/
- (void)FTD_WebView:(FTDIntegrationWebView *)webview title:(NSString *)title;
/**
* webview监听
*/
- (void)FTD_WebView:(FTDIntegrationWebView *)webview shouldStartLoadWithURL:(NSURL *)URL;
/**
* webview开始加载
*/
- (void)FTD_WebViewDidStartLoad:(FTDIntegrationWebView *)webview;
/**
* webview加载完成
*/
- (void)FTD_WebView:(FTDIntegrationWebView *)webview didFinishLoadingURL:(NSURL *)URL;
/**
* webview加载失败
*/
- (void)FTD_WebView:(FTDIntegrationWebView *)webview didFailToLoadURL:(NSURL *)URL error:(NSError *)error;
@end

我们定义一个协议,让WKWebView和UIWebView相应的代理方法里面实现上面相应的协议方法。

阅读全文 »

Hello Hexo

发表于 2016-06-18   |   分类于 开发小集

Quick Start

新建文章

1
$ hexo new "My New Post"

查看: Writing

开启预览访问端口

1
$ hexo server

查看: Server

生成静态页面至public目录

1
$ hexo generate

查看: Generating

部署服务

1
$ hexo deploy

查看: Deployment

阅读全文 »
BinBear

BinBear

鱼在温水里会很容易的煮死,毛毛雨会很容易的打湿衣服,因为这些看似没有杀伤力的东西最容易让人丧失警惕。

2 日志
2 分类
4 标签
GitHub 微博
© 2017 BinBear
由 Hexo 强力驱动
主题 - NexT.Mist