使用NSNotificationCenter 事件通知
2015-04-08 11:45
232 查看
在进行与服务器通信的时候,经常是一个UI类去请求服务器数据,然后服务器将回调到appDelegate,这个时候我以前的做法是在AppDelegate中保存 和维护这个UI类的指针,然后appDelegate在收到返回消息的时候,如果这个UI类的指针还存在,并且不为NULL,那么就直接调用UI类的指针。这种方法太麻烦了。
今天才发现有NSNotificationCenter这个东东。
使用方法如下:
(1)首先注册 要接收Notification的对象 到 NSNotificationCenter,一般这段代码放在init或者onEnter里面。
代码如下:
NSString* const strFuckMe = @"FuckMe";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onFuckme:)
name:strFuckMe object:nil];
第一个参数是要接收Notification的对象,第二个参数是响应函数,第三个是通知的名称,第四个参数表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知。
(2)既然init里面注册了这个通知,那么就需要在dealloc里面移除这个通知的注册:
代码如下:
[[NSNotificationCenter defaultCenter] removeObserver:self
name:strFuckMe object:nil];
(3)怎么发送Notification通知呢?
代码如下:
如果不需要传递参数的通知:
[[NSNotificationCenter defaultCenter]postNotificationName:strFuckMe object:nil];
如果要传递参数的通知:
SFuckRet sFuckRet;
NSValue* value = [NSValuevalueWithBytes:&sFuckRetobjCType:@encode(SFuckRet)];
[[NSNotificationCenter defaultCenter] postNotificationName:strFuckMe object:nil userInfo:[NSDictionarydictionaryWithObjectsAndKeys:value,@"value",nil]];
SFuckRet是一个定长的结构体对象,所以需要用NSValue来包装以下,才能放到Object-c的容器中。
postNotificationName参数是要发送的通知的名字,object:参数是一个id,一般可以传递self,可以让接收通知者能调用的发送通知者。
userInfo是一个NSDictionary可以传递自己的其他信息。一般数据都放在这个里面。
注意一般NSValue一般用来包装定长的结构体,CGRect,CGPoint什么的,千万不能包含指针之类的东西。
(4)如何处理通知呢?
代码如下:
- (void)onFuckme:(NSNotification*)notification
{
NSDictionary* user_info = [notification userInfo];
NSValue* value = [user_info objectForKey:@"value"];
SFuckRet sfuckRet;
[value getValue:&sfuckRet];
}
NSDictionary* user_info = [notification userInfo]; 这句代码就是取出PostNitifycation的时候设置的NSDictionary信息。
这样就取出来了所要传递的结构体啦。
今天才发现有NSNotificationCenter这个东东。
使用方法如下:
(1)首先注册 要接收Notification的对象 到 NSNotificationCenter,一般这段代码放在init或者onEnter里面。
代码如下:
NSString* const strFuckMe = @"FuckMe";
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onFuckme:)
name:strFuckMe object:nil];
第一个参数是要接收Notification的对象,第二个参数是响应函数,第三个是通知的名称,第四个参数表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知。
(2)既然init里面注册了这个通知,那么就需要在dealloc里面移除这个通知的注册:
代码如下:
[[NSNotificationCenter defaultCenter] removeObserver:self
name:strFuckMe object:nil];
(3)怎么发送Notification通知呢?
代码如下:
如果不需要传递参数的通知:
[[NSNotificationCenter defaultCenter]postNotificationName:strFuckMe object:nil];
如果要传递参数的通知:
SFuckRet sFuckRet;
NSValue* value = [NSValuevalueWithBytes:&sFuckRetobjCType:@encode(SFuckRet)];
[[NSNotificationCenter defaultCenter] postNotificationName:strFuckMe object:nil userInfo:[NSDictionarydictionaryWithObjectsAndKeys:value,@"value",nil]];
SFuckRet是一个定长的结构体对象,所以需要用NSValue来包装以下,才能放到Object-c的容器中。
postNotificationName参数是要发送的通知的名字,object:参数是一个id,一般可以传递self,可以让接收通知者能调用的发送通知者。
userInfo是一个NSDictionary可以传递自己的其他信息。一般数据都放在这个里面。
注意一般NSValue一般用来包装定长的结构体,CGRect,CGPoint什么的,千万不能包含指针之类的东西。
(4)如何处理通知呢?
代码如下:
- (void)onFuckme:(NSNotification*)notification
{
NSDictionary* user_info = [notification userInfo];
NSValue* value = [user_info objectForKey:@"value"];
SFuckRet sfuckRet;
[value getValue:&sfuckRet];
}
NSDictionary* user_info = [notification userInfo]; 这句代码就是取出PostNitifycation的时候设置的NSDictionary信息。
这样就取出来了所要传递的结构体啦。
相关文章推荐
- 使用ASP.NET AJAX开发服务器端事件通知器
- WCF中使用观察者模式实现事件通知
- 正确使用Java事件通知
- 使用.NET事件模型通知文件拷贝进度
- 正确使用Java事件通知
- 菜鸟好文推荐(三)——正确使用Java事件通知
- 使用 PowerShell and WMI 事件查询构建强大的通知体系
- 《Effective C#》读书笔记——条目25:用事件模式实现通知<使用C#表达设计>
- Ajax同步的调用场景——使用同步Ajax在 onunload 事件时通知服务器
- 正确使用Java事件通知
- Ajax的同步调用场景——使用同步Ajax在 onunload 事件时通知服务器
- Ajax的同步调用场景——使用同步Ajax在 onunload 事件时通知服务器
- 使用NSNotificationCenter 事件通知
- 使用inotify进行文件事件通知
- 事件回调 和通知方式的总结(EventBus框架的使用)
- 正确使用Java事件通知
- 由于控制器不销毁且使用了通知而造成重复多次执行通知的事件
- 多线程异步编程(2):创建多个线程执行任务,同时更新进度条,使用观察者模式,利用事件通知界面更新。移除对Form的引用,彻底解除界面与逻辑的耦合
- 使用NSNotificationCenter 事件通知
- WCF中使用观察者模式实现事件通知