IOS中的协议Protocol与代理Delegate以及通知

Protocol和Delegate简介

Protocol协议类似于Java中的接口,是一个自定义方法的集合,让遵守这个协议的类去是实现为了达到某种功能的这些方法,与Java接口不同的是协议中可以定义可选择实现的方法。Delegate代理是一种设计模式,是一个概念,只不过在Objective-C中通过Protocol来进行实现,指的是让其他类来通过本类中定义的协议代理方法‘远程’帮助实现一些操作,完成一些任务,本类会在合适的时机通过代理通知实现协议的远程类去做指定的任务。

通过协议实现代理模式的示例

协议代理来源的本类:

#import <UIKit/UIKit.h> 
/** * 定义协议 */
@protocol AccountDelegate <NSObject>

@required // 必须实现的方法,默认是@required /** * 选中cell的代理事件 */
- (void) selectedCell:(NSInteger)index;

@optional // 非必须实现的方法 /** * 更新下拉菜单的高度 */
- (void) updateListH;

@end

@interface PopListTableViewController : UITableViewController

/** * 定义代理,委托其他类来帮助本类完成一些其他任务,本类通过下面定义的delegate来通知其他实现上面协议的其他类 */
@property (nonatomic, weak) id<AccountDelegate>delegate;

@end

然后本类在实现中通过定义的delegate通知其他遵守协议的类去执行某个方法:

// 通知代理,同时将cell的行号传出去 [_delegate selectedCell:indexPath.row];

然后遵守协议的类就可以收到上面的通知自动执行(注意是通知触发的方法执行,而不是手动调用方法)selectedCell这个方法了:

首先要在实现中声明遵守上面的协议:

// 遵守AccountDelegate协议,如果遵守多个协议用逗号隔开:<AccountDelegate, ...> @interface PopMenuViewController()<AccountDelegate>

实现协议方法:

/** * 实现协议方法,监听代理,代理通知来了后下面的方法会自动执行,接收传过来的参数 */
- (void)selectedCell:(NSInteger)index {
    // 这里可以做一些事情,也就是想委托当前这个类要做的那些任务了     // ... }

问题1: Objective-C中的协议和java中的接口概念有何不同?

Objective-C中的协议和java中的接口非常类似,但Java中的接口规定实现接口的类必须要实现接口中定义的所有方法,当然默认Objective-C协议中定义的方法也是要必须实现的,只不过Objective-C的协议里的方法有两种类型:必选类型(@required)和可选类型(@optional)。必须类型是必须要实现的,而可选类型是根据需要选择性实现的。默认是必选类型。

问题2: OC中协议的概念以及协议中方法的默认类型?
OC中的协议类似于Java中的接口,是一个功能方法的集合,但协议本身不是一个类不会自己去实现协议里的方法,而是委托其他任何类去使用实现,通常用来实现委托代理设计模式,实现不同类对象之间的事件消息通信。

协议中的方法默认都是@required类型的,也就是使用该协议的类必须实现协议里的这些方法。而明确使用@optional修饰的方法可以被使用的类选择性的去实现。

问题3: 什么是代理?作用是什么?
代理是一种设计模式,又叫‘委托’,指的是一个类对象在某些特定时刻通知到其他类的对象去做一些任务,但不需要获取到那些类对象的指针,两者共同来完成一件事,实现不同对象之间的通信。

作用主要是大大减小了对象之间的耦合度,是代码逻辑更加清晰有序,减少了框架复杂度,也便于代码的维护扩展。另外消息的传递过程可以有参数回调,类似于Java的回调监听机制,大大提高了编程的灵活性。

问题: 什么是推送消息?和Notification有什么不同?
消息推送指的是在App关闭不在前台运行时,向用户发送App的内部消息。消息推送通知和OC中的Notification通知机制不同,推送的消息是给用户看的,也就是可见的,而通知机制是OC语言中类间通信的一种机制,基于观察者模式,目的是触发内部事件,减小类之间的耦合度,而对用户是不可见的。

推送消息的可见形式主要有以下几种:

锁屏界面的横幅推送消息;
顶部通知栏的横幅推送消息;
应用图标上的代表消息数量的红色数字;
菜单页面弹出框提示;
播放声音提示;


60.png

iOS开发中有两种类型的消息推送:本地消息推送(Local Notification)和远程消息推送(Remote Notification)。

本地消息推送: 本地推送很简单,不需要联网,不需要服务器,由客户端应用直接发出推送消息,一般通过定时器在指定的时间进行消息推送。

远程消息推送: 远程推送过程略为复杂,需要客户端从苹果的APNS(Apple Push Notification Services)服务器注册获得当前用户的设备令牌并发送给应用的服务器,然后应用的服务器才可以通过APNS服务器间接地向客户端发送推送消息,期间难免会有延迟。

远程推送的具体流程如下图所示,开发中要和服务器合作共同完成:

App客户端向APNS苹果服务器发送设备的UDID和Bundle Identifier;
APNS服务器对传过来的信息加密生成一个deviceToken,并返回给客户端;
客户端将当前用户的deviceToken发送给自己应用的服务器;
自己的服务器将得到的deviceToken保存,需要的时候利用deviceToken向APNS服务器发送推送消息;
APNS服务器接收到自己服务器的推送消息时,验证传过来的deviceToken,如果一致则将消息推送到客户端;
2.利用deviceToken进行数据传输,推送通知

问题: 什么是Notification?什么时候用Delegate,什么时候用Notification?

Notification通知是Cocoa框架中基于观察者模式实现的用于‘一对多’传播消息的一种机制。项目中的对象将它们自己或者其他对象添加到通知的观察者列表里(这个过程又叫通知注册),其中项目中的所有通知都有一个唯一的字符串标识作为通知名唯一确定每个通知,通知源也就是被观察者可以创建通知对象并发送到通知中心,通知中心找出所有注册该通知的对象(观察者),并将从被观察者那里收到通知以消息的方式发送给所有的观察者们。被观察者发送通知是一个同步过程,即发送者在通知中心成功将该发送者之前的消息发送给所有观察者之前不可以再次发送通知。另外通知触发的代理方法都必须符合某个单一参数签名约定,代理方法的参数是一个通知对象,参数里包含着通知名、被观察者和一个包含其他额外信息的字典。


65.jpeg

Delegate和Notification的主要区别在于前者是一对一的消息传递,而后者是一对多的,可以根据这个特点在使用中进行选择。另外代理模式中,接受者reciever可以返回值给sender发送者,实现一种回调,而观察者模式中观察者不可以返回值给被观察者,因此在需要实现回调时只能选择代理模式。

其他问法:

delegate和notification的区别是什么?分别在什么情况下使用?
通知Notification和协议Protocol的不同之处

问题: NSNotification、Delegate、Block和KVO的对比?
Delegate代理是一种回调机制,是一对一的关系;而通知是基于观察者模式的一对多的关系,消息会发送给所有注册为事件观察者的对象;Delegate比Notification的执行效率要高;

Block和Delegate一样通常也是一对一的通知,使用场景相同,可以说Block是Delgate的另一种形式,但Block更加简洁直接且轻便灵活,不需要像Delegate那样需要定义协议很多方法,而且代理对象要实现协议方法,还需要建立对象间的代理关系才可以通信。在通信事件比较多的情况下,还是建议使用Delegate,Delegate的定义实现形式更加直观清楚。

KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。 NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。

KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如买卖股票,我们一般使用delegate。 Notification一般是进行全局通知,比如利好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就需要知道经纪人,经纪人也不要知道自己的顾客。Notification是弱关联,利好消息发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接收的人也可以正常发出消息。 ***

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容