1 前言
Cocoa Touch提供了一个机制,可以通知你的应用程序所发生的变化,例如:iPhone上锁和解锁变化,设备方向变化,用户界面元素触发键盘在屏幕上显示,电池电量水平的变化或者设备的连接,文本编辑视图的更新,剪切板的变化等,以上仅仅是UIApplication,UIWindow,UIDevice,UITextView和UIPasteboard生成的,标准的命名结尾一般都是Notification。今天我们就来学习一下通知机制。
2 详述
2.1 应用程序通知
想让我们的程序被通知到,需要提供一个对象,一个选择器,以及通知的名称。有个成为NSNotificationCenter的中央服务用来在那些产生通知的对象和需要接受通知的对象之间传输信息,分发的对象是NSNotification类的实例。
通知中心的行为好比邮局,通知本身就是信件。
如果想要收到系统事件的通知,你要先告诉通知中心关于自己的信息。
例如你想知道你的应用程序合适被运行或者解锁:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(becomeActive:) name:UIApplicationDidBecomeActicveNotification object:nil];
第一个参数是self,用来告诉通知中心这个视图控制器将处理通知。选择器becomeActive制定了要发送到视图控制器的消息,name说明了控制器的意图。object参数在这个例子中没有使用,它用来表示通知的发送者。nil表示要接受这种类型的所有通知,而不管它来自哪个对象。
这样当用户可以进行界面操作时,UIApplicationDidBecomeActiveNotification就会被交付给控制器来进行处理。
如果视图控制器不再需要知道这些事件,那么应该告诉通知中心,这是非常重要的。如果不这么做,你的应用程序可能会崩溃,原因是:一个通知被触发并执行相关的操作,但是如果注册的对象被释放了,而通知还会被发送到你刚才释放的对象上,这样内存调用就会出错。
解决办法就是确保每一个 -addObserver: 都对应一个-removeObserver:。也可以使用-removeObserver:一次性移除所有的通知。
观察者是在对象初始化时候添加的,所以在-dealloc:中将其移除。
-(void)dealloc{
...
[[NSNotificationCenter defaultCenter] removeObserver:self];
[super dealloc];
}
2.2 自定义通知
通知的名字只是一个字符串对象,在类的接口声明中需要这样定义:
extern NSString* MyConnectionDidFinishNotification;
在对象中,需要定义通知名称
NSString* MyConnectionDidFinishNotification = @"MyConnectionDidFinishNotification";
需要这样提交通知:
[[NSNotificationCenter defaultCenter] postNotificationName:MyConnectionDidFinishNotification object:self];
在应用程序中任何对象都可以调用MyConnectionDidFinishNotification的 -addObserver 方法来得到消息,然后就可以更新视图,控制器和模型了。
3 结语
以上是所有内容,希望对大家有所帮助。