IOS通知的详解

本文详细介绍了iOS中通知(Notification)的使用,包括为何使用通知、通知的概念、通知的运作原理,以及NSNotification和NSNotificationCenter的使用。重点讲解了如何发布、注册和处理通知,以及注意事项,如在对象释放前需要取消注册通知监听器。此外,还探讨了通知与代理的区别,并给出了具体的示例代码,展示了如何发送、接收和处理通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、为什么要使用通知

使用 Notifications
用户可能使用一个软件并打开了几个document, 然后他发现紫色的背景颜色实在是不利于阅读文档正文. 于是,他打开Preferences修改背景颜色,不过令人失望的是,已经存在的文档的背景颜色不会跟着改变. 于是,这个用户可能会写信给你告诉你这些.
你也许会回复:”defualts会在document创建的时候才读取,保存document在打开”实际上。
(用户的想要使用一个功能,操作太多,加大了app的使用难度,毕竟不是每一个用户都是使用app的高手,这样的用户的体验是不好的)

2、 什么是Notification?

这个要求其实也很容易实现.
每个运行中的application都有一个NSNotificationCenter的成员变量,它的功能就类似公共栏.
对象注册关注某个确定的notification(如果有人捡到一只小狗,就去告诉我). 我们把这些注册对象叫做 observer(观察者). 其它的一些对象会给center发送notifications(我捡到了一只小狗). center将该notifications转发给所有注册对该notification感兴趣的对象. 我们把这些发送notification的对象叫做 poster(海报–消息的发布者).

很多的标准Cocoa类会发送notifications: 在改变size的时候,Window会发送notification; 选择table view中的一行时,table view会发送notification;我们可以在在线帮助文档中查看到标准cocoa对象发送的notification

关于例子的解释
在我们的例子中,我们将MyDocumet对象注册为observer. 而preference controller在用户改变color时将发送notification. MyDocument在接受到该notification后改变background color
(MyDocumet 作为一个观察者,preference controller 作为一个消息的发布者,用户改变color时,preference controller将color改变的信息传递给通知中心,通知中心再发布通知,MyDocumet 作为观察者就会接受到color改变的信息,这个时候MyDocumet 就会调用方法刷新background color)

注意点:在MyDocument对象释放前,我们必须从notificationcenter移除我们注册的observer. 一般我们在dealloc方法中做这件事(这个是为了避免野指针错误(notificationcenter使用一次就会进行一个计数器加1,但是观察者对象并不知道什么时候不在使用默认是不会做计数器减1 操作,这个就需要我们手动的在dealloc 这个方法中移除notificationcenter 做一个计数器减1 的操作))

3、Notifications 不是什么

当程序员们听到notificationcenter的时候, 他们可能会联想到IPC(进程间通讯).
他们认为:”我在一个程序中创建一个observer,然后在另外一个程序中发送一个notification”.
这个设计没有办法工作的, notificationcenter允许同一个程序中的不同对象通许,它不能跨越不同的程序
[Notification 就是设计模式中的 观察者模式, cocoa为我们实现了该模式]

4、NSNotification 和 NSNotificationCenter

Notification对象非常简单. 它就是poster要提供给observer的信息包裹.
notification对象有三个重要的成员变量: name , object 和 userInfo。 一般object都是指向poster(为了让observer在接受到notification时可以回调到poster)

@property (readonly, copy) NSString *name;
@property (readonly, retain) id object;
@property (readonly, copy) NSDictionary *userInfo;

NSNotificaitonCernter是架构的大脑了.它允许我们注册observer对象, 发送notification, 撤销 observer 对象注册

//下面是它的一些常用方法 
// 获取通知中心
+ (NSNotificationCenter *)defaultCenter
// 返回notificationcenter [**类方法,返回全局对象, 单件模式.cocoa的很多的全局对象都是通过类似方法实现**]

// 注册一个通知
- (void)addObserver:(id)anObserver
           selector:(SEL)aSelector
               name:(NSString *)notificationName
             object:(id)anObject
// 关于参数:
    anObserver:通知的观察者--->那个对象要监听通知 (任何继承自NSObject的对象都可以作为观察者)
    aSelector:观察者监听到通知后要调用的方法
    notificationName:观察者监听的通知的名称————>通知是一个字符串
    anObject:同时的发送者(poster)对象————>notificationName 这条通知的发送者
    这个方法的意思:当anObserver对象监听到anObject对象发送的notificationName通知 就会调用anObserver 的 aSelector这个方法。
注意: 
    如果notificationName为nil. 那么notificationcenter将anObject发送的所有notification转发给observer
    如果anObject为nil.那么notificationcenter将所有名字为notificationName的notification转发给observer
    如果notificationName 和 anObject 都为空,那么notificationcenter将所有对象发
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值