1. block回调与其他2种回调方式的区别
1) IOS常用回调方式有3种,如:delegate、NSNotificationCenter和block。
2) 通知:
(一对多)在APP中,很多控制器都需要知道一个事件,应该用通知;
3) delegate:
“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;block没有协议方法,也不需要delegate代理对象
代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
4) block:
写法更简练,不需要写protocol、函数等等
block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
一对一,与代理类似,但是block没有协议方法,也不需要delegate代理对象
__weak typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
补充: 这三种通信方式都实现了对象之间的解耦合。(解耦合就是两个对象建立了一种通信关系,但是它们没有关联得特别紧。也可以说是他们没有依赖于某一个对象)
2. 什么情况下使用block回调或delegate回调
1) IOS常用回调方式有3种,如:delegate、NSNotificationCenter和block。
2) 通知:
(一对多)在APP中,很多控制器都需要知道一个事件,应该用通知;
3) delegate:
“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;block没有协议方法,也不需要delegate代理对象
代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败
4) block:
写法更简练,不需要写protocol、函数等等
block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
一对一,与代理类似,但是block没有协议方法,也不需要delegate代理对象
block需要注意防止循环引用:
ARC下这样防止:__weak typeof(self) weakSelf = self;
[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {
[weakSelf doSomething];
}];
补充: 这三种通信方式都实现了对象之间的解耦合。(解耦合就是两个对象建立了一种通信关系,但是它们没有关联得特别紧。也可以说是他们没有依赖于某一个对象)
2. 什么情况下使用block回调或delegate回调
1) 公共接口,方法较多也选择用delegate进行解耦(iOS有很多例子比如最常用tableViewDelegate,textViewDelegate)
2) 异步和简单的回调用block更好 (iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类)
3) 它们都是为了在具体的实现Delegate或Block中再进行处理,属于策略模式,具体算法在具体算法类中实现。
3. block回调的设计步骤
1) 先声明: #type void(^MyBlock) (int a,int b)
2) 定义声明的block
- (void)viewDidLoad
{
[super viewDidLoad];
[self blockTest:^(int a, int b) {
int c = a + b;
NSLog(@"步骤2:%i",c); //回调函数,这里是先执行步骤1的函数
}];
}
{
[super viewDidLoad];
[self blockTest:^(int a, int b) {
int c = a + b;
NSLog(@"步骤2:%i",c); //回调函数,这里是先执行步骤1的函数
}];
}
3) 调用block
- (void)blockTest:(MyBlock )myBlock
{
NSLog(@"步骤1");
myBlock(10,20);
}
{
NSLog(@"步骤1");
myBlock(10,20);
}
4. block回调例子
1) 例子1:
/**
* 需求:在cel
* 需求:在cel