常规实现

代理协议

1.  协议:声明一个Protocol,协议里声明方法;
2.产生事件的类:有一个代理属性delegate
id<Protocal>_delegate;
3.  实现事件的类:实现Protocol里的方法;

Block

1 基本概念

1.  block是匿名函数代码块,block声明就是传值,代码块并没有被运行,block回调的时候代码块才被执行
2.  block里的代码块修改block外面的变量,需要在变量前加上关键字__block,如果进行block操作,外面的变量值也会变化

2 语法

(1) 重命名相同返回值类型,相同参数类型的Block

typedef 返回值类型(^Block名字)(参数类型1,参数类型2...)

(2) block的赋值

Block = ^(参数类型1,参数类型2,...){
    ... ...
}

(3) 遍历数组

- (void)enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL *_Nonnullstop) {

}

(4) 遍历字典

- (void)enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {

}

观察者

1 基本概念

1.  代码写在响应事件的类里,并且该类应有产生事件的类属性
2.  观察者可以实时响应数据的改变
3.  观察者要手动释放,覆写dealloc调用removeObserver

2增加观察者

- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath options:(NSKeyValueObservingOptions)options context:nil;
1.  产生事件的类属性调用:_child
2. addObserver:self---苹果已经在内部定义好观察者,只需在此传入响应事件对象
3.  forKeyPath:观察的产生事件的属性
4. options:传递给接收者的值的类型,旧的还是新的
5. context:可为空,nil

3 覆写观察者响应

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:( NSDictionary *)change context:nil;
1.  object:观察的对象,即产生事件的对象,可以用类型强转
2.  keypath:如果有多个观察者,可以用if判断keypath == 关键属性执行相应操作
3.  change:字典,里面包含了观察属性的值,新的,旧的,属性的值可以通过change[@"new"]、change[@"old"]来获取
4. context:可为空,nil

4 释放观察者

- (void)removeObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath;
1.  在增加观察者的类里覆写
2.  此类应有产生事件的类的属性, _child调用
3.  observer:self   
4.  keypath:观察的属性@""

通知

1 发出一个通知

[NSNotificationCenter defaultCenter] postNotificationName:(NSString *)aName object:self;
[NSNotificationCenter defaultCenter] postNotificationName:(NSString *)aName object:self userInfo:(nullable NSDictionary *)aUserInfo;
1.  两者都可以发出一个通知,后者可以传入一个用户信息的字典
2.  postNotificationName:发出通知的名字
3.  object:self

2 接受一个通知

[NSNotificationCenter defaultCenter] addObserver:self selector:(SEL)aSelector name:(nullable NSString *)aName object:nil;
1.  注册一个通知观察者,观察名字为"aNAme"的通知
2.  addObserver:在这里就是self
3.  selector:接到通知后调用的方法
4.  name:指定接收通知的名字
5.  object:指定接收某个对象的通知,可为nil

3 移除通知观察者

- (void)dealloc {
[NSNotificationCenter defaultCenter] removeObserver:self name:(nullable NSString *)aName object:nil;
}
1.  在dealloc覆写里移除
2.  removeObserver:添加的观察者,即self
3.  name:观察的通知的名字
4.  object:可为空,nil
posted on 2016-04-19 19:37  Apel  阅读(101)  评论(0编辑  收藏  举报