1.通知中心
通知中心实际上是在程序内部提供了消息广播的一种机制。通知中心不能在进程间进行通信。实际上就是一个二传手,把接收到的消息,根据内部的一个消息转发表,来将消息转发给需要的对象。通知中心是基于观察者模式的,它允许注册、删除观察者
通知中心的使用可以分为4个步骤。
这里需要额外提一点的是:发送消息不仅仅可以有用户发起,也可以是系统发起。
当我们注册了某个消息的观察者后,如果有了对应的消息,则观察者会收到相应的消息,并展开处理。这里需要注意的是,当使用完消息之后,不想在接收到消息,则需要把观察者移除,否则会出现错误。注册通知:即要在什么地方接受消息
[[NSNotificationCenter defaultCenter]
参数介绍:
addObserver:观察者,即在什么地方接收通知;
selector:收到通知后调用何种方法,即回调函数;
name:通知的名字,也是通知的唯一标示,编译器就通过这个找到通知的。
发送通知:调用观察者处的方法。
[[NSNotificationCenter defaultCenter] postNotificationName:@" postData " object:searchFriendArray];
2.代理
delegate最常用,就不写了
一,概述
KVO,即:Key-Value Observing,它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知。简单的说就是每次指定的被观察的对象的属性被修改后,KVO就会自动通知相应的观察者了。
二,使用方法
系统框架已经支持KVO,所以程序员在使用的时候非常简单。
1. 注册,指定被观察者的属性,
2. 实现回调方法
3. 移除观察
三,实例:
假设一个场景,股票的价格显示在当前屏幕上,当股票价格更改的时候,实时显示更新其价格。
1.定义DataModel,
[cpp] view plaincopy
- @interface
StockData : NSObject { -
NSString * stockName; -
float price; - }
- @end
- @implementation
StockData - @end
2.定义此model为Controller的属性,实例化它,监听它的属性,并显示在当前的View里边
[cpp] view plaincopy
- -
(void)viewDidLoad - {
-
[super viewDidLoad]; -
stockForKVO = [[StockData alloc] init]; -
[stockForKVO setValue:@"searph" forKey:@"stockName"]; -
[stockForKVO setValue:@"10.0" forKey:@"price"]; -
[stockForKVO addObserver:self forKeyPath:@"price" options:NSKeyValueObservingOptio nNew|NSKeyValueObservingOptio nOld context:NULL]; -
myLabel = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 30 )]; -
myLabel.textColor = [UIColor redColor]; -
myLabel.text = [stockForKVO valueForKey:@"price"]; -
[self.view addSubview:myLabel]; -
UIButton * b = [UIButton buttonWithType:UIButtonTypeRoundedRect]; -
b.frame = CGRectMake(0, 0, 100, 30); -
[b addTarget:self action:@selector(buttonAction) forControlEvents:UIControlEventTouchUpIns ide]; -
[self.view addSubview:b]; - }
3.当点击button的时候,调用buttonAction方法,修改对象的属性
[cpp] view plaincopy
- -(void)
buttonAction - {
-
[stockForKVO setValue:@"20.0" forKey:@"price"]; - }
4. 实现回调方法
[cpp] view plaincopy
- -(void)observeValueForKeyPath:(NSString
*)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context - {
-
if([keyPath isEqualToString:@"price"]) -
{ -
myLabel.text = [stockForKVO valueForKey:@"price"]; -
} - }
5.增加观察与取消观察是成对出现的,所以需要在最后的时候,移除观察者
[cpp] view plaincopy
- -
(void)dealloc - {
-
[super dealloc]; -
[stockForKVO removeObserver:self forKeyPath:@"price"]; -
[stockForKVO release]; - }
四,小结
KVO这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。
KVC
一,概述
KVC是KeyValueCoding的简称,它是一种可以直接通过字符串的名字(key)来访问类属性的机制。而不是通过调用Setter、Getter方法访问。
当使用KVO、Core Data、CocoaBindings、AppleScript(Mac支持)时,KVC是关键技术。
二,使用方法
关键方法定义在:NSKeyValueCodingprotocol
KVC支持类对象和内建基本数据类型。
valueForKey:,传入NSString属性的名字。
valueForKeyPath:,传入NSString属性的路径,xx.xx形式。
valueForUndefinedKey它的默认实现是抛出异常,可以重写这个函数做错误处理。
setValue:forKey:
setValue:forKeyPath:
setValue:forUndefinedKey:
setNilValueForKey:当对非类对象属性设置nil时,调用,默认抛出异常。
mutableArrayValueForKey:有序一对多关系成员
mutableSetValueForKey:无序一对多关系成员
三,实例:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
四,小结
KVO/KVC这种编码方式使用起来很简单,很适用与datamodel修改后,引发的UIVIew的变化这种情况,就像上边的例子那样,当更改属性的值后,监听对象会立即得到通知。