今天下午把启动了一周的项目重构了一下,用storyboard做界面(之前是代码+xib),block做回调(之前是delegate)。
关于storyboard和block都已经出现好几个年头了,从开发效率上来看,这俩东西再配合ARC上简直是倚天屠龙。
在之前的项目中,回调需要做以下几步:
A类中声明ProtocolA协议及协议下的方法。
A类中声明delegate属性。
B类实现ProtocolA协议以及协议下的方法,并将自身对象赋值给A类对象的delegate属性。
当需要实现回调的时候,直接通过A类对象的delegate属性调用 ProtocolA协议下的方法即可执行B类中对该协议方法的实现。
以前大伙都在这样乐呵乐呵的写,但是有了block之后,步骤变得简单了许多。
用block做回调省了哪些事儿?
不用定义协议及协议方法。
减少冗余,即不需要为回调而创建B并实现协议方法。
闭包特性,使的代码更为紧凑,表达更为直观,即不需要把业务逻辑分散到多个方法中。
废话少说,上代码。
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
57
58
59
60
61
62
| #import <Foundation/Foundation.h>
/**
* 定义名为Block的block
*
* @param str1 block执行时,传入的第一个值
* @param str2 block执行时,传入的第二个值
*
* @return 无返回值 void
*/
typedef void(^Block)(NSString* str1,NSString* str2);
/**
* 定义BlockDemo类
*/
@interface BlockDemo : NSObject
{
/**
* 两个实例变量
*/
Block block1;
Block block2;
}
/**
* 测试方法
*
* @param b1 传入的第一个block
* @param b2 传入的第二个block
*/
-(void)runBeforeBlock:(Block)b1 AndAfterBlock:(Block)b2;
@end
@implementation BlockDemo
-(void)runBeforeBlock:(Block)b1 AndAfterBlock:(Block)b2
{
/**
* 将传入的b1 和b2 赋值给实例变量
*/
block1= b1;
block2= b2;
/**
* 在循环前触发第一个block
*/
b1(@"我是B1",@"开始循环");
for (int i =0 ; i<5; i++) {
NSLog(@"%d",i);
}
/**
* 在循环后触发第二个block
*/
b2(@"我是B2",@"结束循环");
}
@end
int main(int argc, const char * argv[])
{
BlockDemo *bd = [[BlockDemo alloc]init];
[bd runBeforeBlock:^(NSString *str1, NSString *str2) {
NSLog(@"%@ %@",str1,str2);
} AndAfterBlock:^(NSString *str1, NSString *str2) {
NSLog(@"%@ %@",str1,str2);
}];
return 0;
}
|