代理和通知

在MVC模式中,M:模型,是用来做数据操作的;V:视图,是用来展示界面的;C:控制器,对视图中的控件的行为进行操作

为了把视图和方法分隔开,我们经常会时候用到代理和通知模式

代理模式:

       定义代理(三步):1、定义代理协议(定义协议一般是类名后加上delegete)

                                   2、定义代理属性(delegate)

                                   3、定义代理方法(定义方法时,一般要把“自己”带上)

在适当的地方调用代理方法,在调用代理方法时,一般要做一个判断(当然也可以不判断):

if ([self.delegate respondsToSelector:@selector(代理方法名)]) {

            [self.delegate 代理方法];

}

         使用代理(三步):1、设置代理

                                      2、遵守协议

                                      3、实现代理方法

通知(三步):

                      1、添加监听者,注册通知

                      2、在适当的位置发送通知(要先初始化一个通知)

                      3、当监听者对象被销毁时,一定要记得从通知中心把对象移除(一般在dealloc方法中完成)

    通知知中心(NSNotificationCenter)

     每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信

     任何一个对象都可以向通知中心发布通知(NSNotification),描述自己在做什么。其他感兴趣的对象(Observer)可以申请在某个特定通知发布时(或在某个特定的对象发布通知时)收到这个通知

     通知中心是一个单例:

NSNotificationCenter *defaultCen = [NSNotificationCenter defaultCenter];

     通知(NSNotification)

     一个完整的通知一般包含3个属性:

     - (NSString*)name;// 通知的名称

     - (id)object;// 通知发布者(是谁要发布通知)

     - (NSDictionary*)userInfo;// 一些额外的信息(通知发布者传递给通知接收者的信息内容)

初始化一个通知(NSNotification)对象

+ (instancetype)notificationWithName:(NSString *)aName object:(id)anObject;

+ (instancetype)notificationWithName:(NSString)aName object:(id)anObject userInfo:(NSDictionary)aUserInfo;

- (instancetype)initWithName:(NSString)name object:(id)object userInfo:(NSDictionary)userInfo;

发布通知

通知中心(NSNotificationCenter)提供了相应的方法来帮助发布通知

- (void)postNotification:(NSNotification *)notification;

发布一个notification通知,可在notification对象中设置通知的名称、通知发布者、额外信息等

- (void)postNotificationName:(NSString *)aName object:(id)anObject;

发布一个名称为aName的通知,anObject为这个通知的发布者

- (void)postNotificationName:(NSString)aName object:(id)anObject userInfo:(NSDictionary)aUserInfo;

发布一个名称为aName的通知,anObject为这个通知的发布者,aUserInfo为额外信息

注册通知监听器

通知中心(NSNotificationCenter)提供了方法来注册一个监听通知的监听器(Observer)

- (void)addObserver:(id)observer selector:(SEL)aSelector name:(NSString *)aName object:(id)anObject;

observer:监听器,即谁要接收这个通知

aSelector:收到通知后,回调监听器的这个方法,并且把通知对象当做参数传入

aName:通知的名称。如果为nil,那么无论通知的名称是什么,监听器都能收到这个通知

anObject:通知发布者。如果anObject和aName都为nil,监听器就能收到所有的通知

- (id)addObserverForName:(NSString)name object:(id)obj queue:(NSOperationQueue)queue usingBlock:(void (^)(NSNotification *note))block;

name:通知的名称

obj:通知发布者

block:收到对应的通知时,会回调这个block

queue:决定了block在哪个操作队列中执行,如果传nil,默认在当前操作队列中同步执行

取消注册通知监听器

     通知中心不会保留(retain)监听器对象,在通知中心注册过的对象,必须在该对象释放前取消注册。否则,当相应的通知再次出现时,通知中心仍然会向该监听器发送消息。因为相应的监听器对象已经被释放了,所以可能会导致应用崩溃

通知中心提供了相应的方法来取消注册监听器

- (void)removeObserver:(id)observer;

- (void)removeObserver:(id)observer name:(NSString *)aName object:(id)anObject;

一般在监听器销毁之前取消注册(如在监听器中加入下列代码):

- (void)dealloc {

//[super dealloc];  非ARC中需要调用此句

[[NSNotificationCenter defaultCenter] removeObserver:self];

}

通知部分来自:UIKit06-通知和代理

原文链接://www.greatytc.com/p/4afa3a55eb42

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 通知中心(NSNotificationCenter) 通知(NSNotification) 一个完整的通知一般包含...
    JonesCxy阅读 3,446评论 0 1
  • 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知...
    莫离_焱阅读 11,598评论 1 8
  • 代理 代理设计模式的作用: 1.A对象监听B对象的一些行为,A成为B的代理 2.B对象想告诉A对象一些事...
    Hevin_Chen阅读 1,787评论 0 0
  • 代理的使用步骤 定义一份代理协议协议名字的格式一般是:类名 + Delegate比如UITableViewDele...
    Yuann阅读 2,047评论 0 1
  • 后天就要带着复杂的情感离开我温柔的小窝了,在家足足闷了两个月,几乎是用网络、书籍、打发着我的每一天,日子单调而又充...
    tutuli阅读 3,392评论 1 1