前言
何为协议,简单来说在OC中我们使用关键字@protocol
可以声明一个协议,并在协议中添加多个属性、方法供于遵循者实现,从某个角度上来说,这是一种不同于category
机制的category
。在日常开发中,协议可谓无处不在,最为核心的UITableView
通过协议来获取数据、完成事件处理等。下面就是一个最粗浅的协议
1 2 3 4 5 |
@protocol CustomProtocol - (void)doSomething; @end |
对于协议的理解,很多的开发者依旧保留在委托-代理
等于协议
等认知上。然而前者依赖于后者的实现,而后者即便不通过前者也能完成抽象解耦的工作。在继续谈协议可以完成的工作之前,有必要来理解一下何为协议:
协议指定了一套行为规范,遵循协议的类必须实现对应的行为
协议应用
代理回调
开发中我们几乎都会写的代码一定是UITableView
系列的代理和数据源方法。毫无疑问,苹果提供的这个视图是如此的优雅而强大,即便在现在这个数据源方法因代码过多被疯狂吐槽的年代,你依然无法想到其他实现UITableView
的更佳实践,这个控件充分向我们展示了委托-代理
的强大。
协议最简单直观的应用是委托-代理
设计模式,在封装自定义控件的时候,我喜欢使用自定义的协议来完成用户点击等业务处理。个人认为,如果你想要了解代理
这一模式,起码要自定义过自己的代理协议:
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 SegmentControlDelegate @optional - (void)segmentControl: (SegmentControl *)segmentControl didSelectItemAtIndex: (NSUInteger)index; @end @interface SegmentControl: UIView @property (nonatomic, weak) id delegate; @end @implementation SegmentControl - (voice)clickItem: (UIButton *)item { if ([_delegate respondsToSelector: @selector(segmentControl:didSelectItemAtInex:)]) { [_delegate segmentControl: self didSelectItemAtIndex: item.tag]; } } @end |
上面是我曾经自定义过的分段控制器的代理伪实现代码,对于项目开发而言,代理这种回调机制的好处包括不仅于接口目的性强、易于追溯调试
等。
什么时候用代理
这里不免就要提到另一个跟Delegate
同样实用受欢迎的机制Block
。比如常用的分享功能通常使用block
进行结果回调:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
typedef NS_ENUM(NSInteger, ShareResult) { ShareResultSuccess, ShareResultFailed, ShareResultCancel }; - (void)share { [shareManager shareWithResult: ^(ShareResult result) { switch (result) { case ShareResultSuccess: //.... case ShareResultFailed: //.... case ShareResultCancel: //.... } }]; } |
这样的代码看着很紧凑简洁,如果用Delegate
来完成结果回调又是另一种感觉了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
- (void)share { ShareManager * shareManager = [[ShareManager alloc] initWithUrl: @"http://sindrilin.com" title: @"" content: @""]; shareManager.delegate = self; [shareManager share]; } - (void)shareManager: (ShareManager *)shareManager didCompleteShare: (ShareResult)result { switch (result) { case ShareResultSuccess: //.... 议中添加多个属性、方法供于遵循者实现,从某个角度上来说,这是一种不同于 category 机制的category 。在日常开发中,协议可谓无处不在,最为核心的UITableView 通过协议来获取数据、完成事件处理等。下面就是一个最粗浅的协议
对于协议的理解,很多的开发者依旧保留在
协议应用代理回调开发中我们几乎都会写的代码一定是 协议最简单直观的应用是
上面是我曾经自定义过的分段控制器的代理伪实现代码,对于项目开发而言,代理这种回调机制的好处包括不仅于 什么时候用代理这里不免就要提到另一个跟
这样的代码看着很紧凑简洁,如果用
|