您的位置:首页 > 移动开发 > IOS开发

iOS 通知的使用NSNotification的使用

2015-11-02 17:22 411 查看
说明:倘若在一个雷中想要执行另一个类中的方法可以使用通知

1.创建一个通知对象: 使用notificationWithName:object:或者 notificationWithName:object:userInfo:

NSNotification * notification = [NSNotification notificationWithName:kImageNotificationLoadFailed(connection.imageURL)

object:self

userInfo:[NSDictionary dictionaryWithObjectsAndKeys:error,@"error",connection.imageURL,@"imageURL",nil]];

注释: 这里要注意的是,在创建自己的通知时候并不是必须的. 而是在创建自己的通知之前,采用NSNotificationCenter类的方法

postNotficationName:object: 和postNotificationName:object:userInfo:更加便利的发出通知. 这种情况,一般使用NSNotificationCenter的雷方法defaultCenter就获得默认的通知对象, 这样你就可以给该程序的默认通知中心发送通知了. (这里要注意:每个程序都有一个自己的通知中心,即NSNotificationCenter对象. 该对象采用单例设计模式, 采用defaulCenter方法就可以获得唯一的NSNotifiCationCenter对象.)

注意: NSNotification对象是不可变的, 因为一旦创建, 对象是不能更改的.

2.注册通知:addObserver:selector:name:object:

可以看到除了添加观察者之外,还有接收到通知之后执行方法的入口, 即selector得实参. 在使用这个方法时候,首先要检查观察者是否定义了该方法. 例如:添加观察者代码有:

[[NSNotificationCenter defailtCenter] addObserver:self selector:@selector(方法名:) name:NSWindowDidBecomeMainNotification object:nil];

这里保证了self定义了 "方法名:"这个方法.

对于一个任意的观察者observer,不能保证其对应的selector有"方法名:"这个方法, 我们就可以采用[observer respondsToSelector:@selector(方法名:)]
进行检查. 所以完整的添加观察者过程为:

if(
[observer respondsToSelector:@selector(方法名:)] ){

[[NSNotificationCenter defailtCenter] addObserver:self selector:@selector(方法名:) name:NSWindowDidBecomeMainNotification object:nil];

}

注意到addObserver:selector:name:object:不仅指定一个观察者, 指定通知中心发送观察者的消息, 好友接收通知的名字,以及指定的对象. 一般来说不需要指定name和object的, 但如果指定一个object, 观察者将收到改对象的所有通知. 例如把上面的代码中的name设置为nil的haunted, 那么观察者将接收到object对象的所有消息, 但是确定不了接收这些消息的顺序. 如果指定一个通知的名称,观察者将收到它每次发出的通知.
例如, 上面代码中object为nil, 那么对象(self)将收到任何对象发出NSWindowDidBecomeMainNotification通知. 如果既没有指定object, 也没有指定那么, 那么该观察者将收到所有的对象消息.

3.发送通知: postNotificationName:object:或者performSelectorOnMainThread:withObject:waitUntilDone:

例如程序可以实现将一个文本可以进行一系列的转换,例如对于一个实例、RTF格式转换成ASCII格式。而转换在一个类(如Converter类)的对象中得到处理,在诚寻执行过程中可以加入或者删除这种转换。而且当添加或者删除Converter操作时,你的程序可能需要通知其他的对象,但是这些Converter对象并不需要知道被通知对象是什么,能干什么。你只需要声明两个通知,"ConverterAdded"
和 "ConverterRemoved",并且在某一事件发生时就发出这两个通知。
当一个用户安装或者删除一个Converter,它将发送下面的消息给通知中心:
[[NSNotificationCenter defaultCenter]

postNotificationName:@"ConverterAdded" object:self];
或者是
[[NSNotificationCenter defaultCenter]

postNotificationName:@"ConverterRemoved" object:self];
通知中心将会区分它们对象对这些通知感兴趣并且通知他们。如果除了关心观察者的通知名称和观察的对象,还关心其他之外的对象,那么就把之外的对象放在通知的可选字典中,或者用方法postNotificationName:object:userInfo:。
而采用performSelectorOnMainThread:withObject:waitUntilDone:则是直接调用NSNotification的方法postNotification,而postNotificationName和object参数可以放到withObject的实参中。例如:
[[NSNotificationCenter
defaultCenter] performSelectorOnMainThread:@selector(postNotification:) withObject:notification waitUntilDone:YES];//注意这里的notification为自定义的一个通知对象,可定义为NSNotification*
notification = [NSNotification notificationWithName:@"ConverterAdded"object:self];//那么它的作用与上面的一致
4. 移除通知: removeObserver:和removeObserver:name:object:(注意:使用通知一定要移除通知,在-

- (void)dealloc中)
其中, removeObsever:是删除通知中心保存的调度表一个观察者的所有接口.

而removeObserver:name:object:是删除匹配了通知中心保存的调度表中观察者的一个入口。

这个比较简单,直接调用该方法就行。例如:
[[NSNotificationCenter defaultCenter] removeObserver:observer name:nil object:self];

注意参数notificationObserver为要删除的观察者,一定不能置为nil。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: