A   17:02:32
我看到例子
    if (motion == UIEventSubtypeMotionShake )
    {
        // User was shaking the device. Post a notification named "shake".
        [[NSNotificationCenter defaultCenter] postNotificationName:@"shake" object:self];
    }
A   17:02:40
请问这样有什么效果吗?
A   17:03:07
只是post 其他什么都没做
B   17:04:14
addObserver:selector:name:object:  你在程序里搜下这个函数
A   17:04:27
看到了
B   17:04:49
看name:的参数是不是shake
A   17:05:22
对啊  这不是这个notification的名字吗?
B   17:05:20
他这样的写法是传递不了参数的
A   17:05:44
哦 那要如何传?

B   17:05:47
- (void)postNotification:(NSNotification *)notification  用这个传递
B   17:06:04
自己先定义一个nsnotification 对象
B   17:06:25
+ (id)notificationWithName:(NSString *)aName object:(id)anObject userInfo:(NSDictionary *)userInfo   
B   17:06:49
userInfo就是你要传递的参数
B   17:06:55
addObserver:selector:name:object:
A   17:06:56
在userinfo里传递?
B   17:07:24

A   17:07:25
先定义再监听  就可以获取了?
B   17:07:51
addObserver:selector:name:object:  的selector应该是这样子的
A  17:08:40
那这样selector 可不可以不用调用函数了?
B   17:08:41
-(void)foo:(nsnotification *)notification {
     id yourParam = [notification userInfo];

B   17:09:00
selector 就调用foo
B   17:09:43
nsnotificationcenter调用的foo
A   17:10:55
然后获取的时候就  [notification userinfo]?
B   17:11:54
[NSNotificationCenter postNotification:[NSNotification notificationWithName:"Shake" object:nil userInfo:(your param)]]
B   17:12:04

A   17:12:21
恩 大概了解了  太感谢了 纠结一天了 
B   17:12:42
这是一个观察者模式
A   17:13:22
第一次接触 搞不懂

A   17:13:36
确实不懂这个notification的作用
A  17:14:24
还有个问题 
B  17:14:26
NSNotification 用来保持事件名和你需要传递的参数
A   17:14:50
如果不传递参数 那notification 不只起到seletor的作用吗/
A   17:15:02
对于post方  有什么作用?
A   17:15:12
就保持事件名吗?
B   17:16:01
嗯   对,  如果不传递参数nsnotification用处不大
A   17:16:34
疑团 慢慢解开了  舒畅啊 
A   17:16:38
哈哈 谢谢了

(A 我,小白     B 大牛)



----后记,补充
经过2天左右的时间,终于把NSNotification的问题搞定了,太开心了。
昨天做了一个demo,一直不成功,心情很不爽,今天来了继续向大牛请假,终于首先把NSNotification的原理搞懂了。
postNotification的作用是保存参数,并把这个新建立的notification发送给NotificationCenter,NotificationCenter的作用就是消息的存储库,既可以向里面存放消息,又可以从里面提取消息。
当用post传递参数之后,在其他类中用 [[NSNotificationCenter defaultCenter] addObservet:self selector:@selector(method) name:@"string" object:nil]; 对消息进行监听,要确保string和你之前存放时的notification名字相同,method的作用就是提取参数。
-(void)foo:(NSNotification *)notification
{
    NSDictionary *sendValue=[notification userInfo];
    scoreLabel.text=[[sendValue objectForKey:@"scoreValue"] stringValue];
}
这是我例子中的method 。 到此基本理清了,也应该会运用了。

有收获的感觉真好。

     [tableView setBackgroundColor:color];
}
打开几个窗口,并改变背景颜色,现在,那些打开的窗口的背景颜色立马就变了.

-- 思考 --
通常当你将自己的一个对象设置为cocoa某个标准对象的delegate的时候,你同时或许也对该标准对象的notification感兴趣. 例如,我们实现一个window的delegate来处理 windowShouldClose: , 我们也许会对 NSWindowDidResizeNotification这样的notification感兴趣.
如果一个cocoa标准对象有一个delegate,同时它也发送notification的话, cocoa对象会自动将它的delegate对象注册成为observer来接受接受自己的notification. 如果我们实现了一个delegate,那么delegate[也就是我们的对象]要怎样声明来接受notification呢?[方法的名字是什么?]
方法名字其实很简单: 以notification名字为基准, 先将NS前缀去掉,接着将第一个字母改为小写. 在将后面的Notification去掉,然后加个冒号:. 例如,为了能接受到window的NSWindowDidResizeNotification, delegate可以实现方法:
- (void)windowDidResize:(NSNotification *)aNotification
当window改变大小时,这个方法将自动调用. 对于NSWindow,我们可以在.h或是帮助文档中找到类似的notification 来实现notification方法.

-- 挑战 --
当程序不再是active状态是,让程序发出beep. 当unactive时,NSApplication会发送NSApplicationDidResignActiveNotification的notificaiton. 而我们的AppController是NSApplication的delegate.   函数NSBeep()可以用来发出beep声音

简单说,
1. 效率肯定是delegate比nsnotification高。

2. delegate方法比notification更加直接,最典型的特征是,delegate方法往往需要关注返回值,也就是delegate方法的结果。比如-windowShouldClose:,需要关心返回的是yes还是no。所以delegate方法往往包含should这个很传神的词。也就是好比你做我的delegate,我会问你我想关闭窗口你愿意吗?你需要给我一个答案,我根据你的答案来决定如何做下一步。相反的,notification最大的特色就是不关心接受者的态度,我只管把通告放出来,你接受不接受就是你的事情,同时我也不关心结果。所以notification往往用did这个词汇,比如NSWindowDidResizeNotification,那么nswindow对象放出这个notification后就什么都不管了也不会等待接受者的反应。

如果2个模块之间有关系,就用delegate

比如,view 和 subview,view 和viewController,前一个view 和后一个view,等等兄弟姐妹父子关系

2个模块不沾边的情况下,选notification

相关文章: