iOS -- 通知NSNotification

通知使用步骤:
1、注册通知

        if ([self respondsToSelector:@selector(adjustRootViewPageWithNotification:)]) {
            [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(adjustRootViewPageWithNotification:) name:NOTIFICATIONPOSTTOTOPVIEW object:nil];
        }

一般使用NSNotificationCenter的类方法defaultCenter就获得默认的通知对象,这样你就可以给该程序的默认通知中心发送通知了。注意:每一个程序都有一个自己的通知中心,即NSNotificationCenter对象。该对象采用单例设计模式,采用defaultCenter方法就可以获得唯一的NSNotificationCenter对象。
注意:NSNotification对象是不可变的,因为一旦创建,对象是不能更改的。
注意到addObserver:selector:name:object:不仅指定一个观察者,指定通知中心发送给观察者的消息,还有接收通知的名字,以及指定的对象。一般来说不需要指定name和object,但如果仅仅指定了一个object,观察者将收到该对象的所有通知。例如将上面的代码中name改为nil,那么观察者将接收到object对象的所有消息,但是确定不了接收这些消息的顺序。如果指指定一个通知名称,观察者将收到它每次发出的通知。例如,上面的代码中object为nil,那么客户对象(self)将收到任何对象发出NOTIFICATIONPOSTTOTOPVIEW通知。如果既没有指定指定object,也没有指定name,那么该观察者将收到所有对象的所有消息。

2、发送通知

[[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATIONPOSTTOROOTVIEW object:nil userInfo:[NSDictionary dictionaryWithObject:[NSString stringWithFormat:@"%ld",BUTTONID] forKey:@"buttonid"]];

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

3、注销通知

[[NSNotificationCenter defaultCenter]removeObserver:self name:NOTIFICATIONPOSTTOTOPVIEW object:nil];

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

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

指定消息名称(aName),发消息者(anObject),并且传递了userInfo。
如果object:nil表示以广播方式发消息或者得到消息,这个时候只要消息名字是对的就可以得到这个消息。
object:用来表示 谁发送的消息,或者从谁得到消息。
参数应该在userInfo里面传递。
NSNotification的作用是在同一程序的不同类中传递参数,传递的方法是把参数放在NSDictionary类型的userInfo中。

最后,提醒一下观察者收到通知的顺序是没有定义的。同时通知发出和观察的对象有可能是一样的。通知中心同步转发通知给观察者,就是说 postNotification: 方法直到接收并处理完通知才返回值。要想异步的发送通知,可以使用NSNotificationQueue。在多线程编程中,通知一般是在一个发出通知的那个线程中转发,但也可能是不在同一个线程中转发通知。

你可能感兴趣的:(iOS -- 通知NSNotification)