通知机制

通知中心的概念:

程序内提供了“通知中心”这个对象,期望取得通知的对象预先向通知中心注册期望取得的通知(既:通知的监听,这个对象也就是观察者)。某对象向通知中心发送消息发送请求,这称为“发送通知”,于是,只要是注册过该通知的对象,都会得到通知中心推送的消息。(注:通知必须先监听,后发送,最后必须移除


通知(NSNotification)

一个完整的通知一般包含 3 个属性:
- ( NSString*)name; / / 通知的名称
- ( id)object; // 通知发布者 ( 是谁要发布通知 )
- ( NSDictionary*)userInfo; // 一些额外的信息 ( 通知发布者传递给通知接收者的信息内容 )

初始化一个通知( NSNotification )对象
+ ( instancetype)notificationWithName:( NSString*)aName  object:( id)anObject;
+ ( instancetype)notificationWithName:( NSString*)aName  object:( id)anObjectuserInfo:( NSDictionary*)aUserInfo;
- ( instancetype)initWithName:( NSString*)name  object:( id)object  userInfo:( NSDictionary *)userInfo;

注册通知(通知的监听)

通知中心(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)objqueue:(NSOperationQueue*)queue  usingBlock:(void (^)(NSNotification*note))block;

name :通知的名称
obj :通知发布者
block :收到对应的通知时,会回调这个 block
queue :决定了 block 在哪个操作队列中执行,如果传 nil ,默认在当前操作队列中同步执行

发布通知

通知中心(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 为额外信息

移除通知

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

  通知中心提供了相应的方法来取消注册监听器
- ( void)removeObserver:( id)observer;
- ( void)removeObserver:( id)observer  name:( NSString*)aName object:( id)anObject;

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

- (void)dealloc{

  //[superdealloc]; ARC中需要调用此句

   [[NSNotificationCenter defaultCenter] removeObserver:self];

}


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

通知与代理的比较:

共同点

利用通知和代理都能完成对象之间的通信

(比如A对象告诉D对象发生了什么事情,A对象传递数据给D)


不同点
代理 : 一对一关系 ( 1 个对象 只能告诉 1 个对象 发生了什么事情 )
通知 : 多对多关系 ( 1 个对象 能告诉 N 个对象 发生了什么事情 , 1 个对 能得知 N 个对象 发生了什么事情 )

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

UIDevice通知

UIDevice 类提供了一个单例对象,它代表着设备,通过它可以获得一些设备相关的信息,比如电池电量值 (batteryLevel) 、电池状态 (batteryState) 、设备的类型 (model ,比如 iPod iPhone ) 、设备的系统 (systemVersion )

通过[ UIDevice currentDevice] 可以获取这个单粒对象

UIDevice 对象会不间断地发布一些通知,下列是 UIDevice 对象所发布通知的名称常量:
UIDeviceOrientationDidChangeNotification // 设备旋转
UIDeviceBatteryStateDidChangeNotification // 电池状态改变
UIDeviceBatteryLevelDidChangeNotification // 电池电量改变
UIDeviceProximityStateDidChangeNotification // 近距离传感器 ( 比如设备贴近了使用者的脸部 )

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

键盘通知

我们经常需要在键盘弹出或者隐藏的时候做一些特定的操作 , 因此需要监听键盘的状态

键盘状态改变的时候 , 系统会发出一些特定的通知
UIKeyboardWillShowNotification / / 键盘即将显示
UIKeyboardDidShowNotification // 键盘显示完毕
UIKeyboardWillHideNotification / / 键盘即将隐藏
UIKeyboardDidHideNotification // 键盘隐藏完毕
UIKeyboardWillChangeFrameNotification / / 键盘的位置尺寸即将发生改变
UIKeyboardDidChangeFrameNotification // 键盘的位置尺寸改变完毕

------------------------------------------------------------------------------------------------------------------

系统发出键盘通知时 , 会附带一下跟键盘有关的额外信息 ( 字典 ), 字典常见的 key 如下 :
UIKeyboardFrameBeginUserInfoKey / / 键盘刚开始的 frame
UIKeyboardFrameEndUserInfoKey / / 键盘最终的 frame( 动画执行完毕后 )
UIKeyboardAnimationDurationUserInfoKey // 键盘动画的时间
UIKeyboardAnimationCurveUserInfoKey / / 键盘动画的执行节奏 ( 快慢 )


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值