发送通知
发送通知的目的是用来给外部一些信息,供外部的控制器来监听发送通知的对象内部的一些行为。
//某人发送了一个名为大新闻的通知,通知附带内容info
NSNotification *note = [NSNotification notificationWithName:@“大新闻” object:self userInfo:
@{ @“time” : @“2015.6.1"
@“desc” : @“也没什么大新闻"
}];
[[NSNotificationCenter defaultCenter] postNotification:note];
有人发送,就会有人接收,假设有另一个模拟机接收通知:
[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
- 监听某个行为,第一反应:用代理来监听行为
- 以下两个方法都能监听行为:
- 观察者模式(通知机制)
- 代理模式:如何设计一个代理模式?
代理模式
- 定义一个协议:
协议的格式:控件名 + Delegate,在协议里面声明一些代理方法(一般代理方法都是@optional)
按照苹果官方的命名样式来定义方法名:
@protocol JWLoadMoreFooterDelegate <NSObject>
@optional
-(void)loadMoreFooterDidClickLoadMoreButton:(JWLoadMoreFooter *)footer;
- 声明代理属性
@property (nonatomic, weak) id<JWLoadMoreFooterDelegate> delegate;
想要用代理方法,就要遵循代理的协议
用weak是防止出现循环引用。
原理图如下:
- 在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
- 设置代理,(先让控制器称为footer的代理)
footer.delegate = self;
- 遵守协议
<JWLoadMoreFooterDelegate>
- 调用代理中的方法
[self.delegate loadMoreFooterDidClickLoadMoreButton:self];
- 总结:设置了代理以后,可以监听代理方法
如果你想监听别人的一些行为,那么就要称为别人的代理;
如果你想告诉别人一些内部的事情,那么就让别人称为你的代理。
使用者:遵守协议—>设置代理—>使用代理中的方法来监听
- 告诉代理有没有实现这个方法
if([self.delegate respondsToSelector:@selector(…)]){
[self.delegate loadMoreFooterDidClickLoadMoreButton:self];
}
如果实现这个方法,那么就调用这个代理方法。如果没有实现就不调用。
代理和通知的区别
- 代理:1个对象只能告诉1个代理
- 通知:1个对象可以告诉多个代理,内部只要发了一个通知,外部只要有人接收都可以监听到。
另一种监听方式-KVO
- KVO(Key Value Observing)
常用作用:监听模型属性值的改变
下面是KVO的一个例子,细节的说明已经写在注释当中:
self.p1 = [[JWPerson alloc] init];
self.p1.name = @“p1”;
//self监听了self.p1的name属性的改变
[self.p1 addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionOld context:nil];
self.p1.name = @"pppp1";
#pragma mark - KVO监听方法
//self得实现监听方法
/**
*当监听到object的keyPath属性发生了改变
*/
//这个方法继承于NSObject,所以不需要遵守其他协议,任何对象都可以调用这个方法
//改变了object的哪个值(KeyPath),改成了什么(字典change)
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"监听到%@对象的%@属性发生了改变, %@", object, keyPath, change);
}
- 总结KVO:
- 对象自己添加观察者,监听对象的属性的改变
KVC:常见作用:给模型属性赋值 - 注意点
- 无论是KVO还是通知,监听完后都要将观察者销毁
-(void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
addTarget方法
- addTarget方法是最基本的监听方法,对象可以调用该方法,实现对其他对象的监听,同时也可以设置调用其他的方法。
- (void)addTarget:(id)target action:(SEL)action
注:如有错误,请及时和我交流。感谢批评指正~~