今天下午把启动了一周的项目重构了一下,用storyboard做界面(之前是代码+xib),block做回调(之前是delegate)。

关于storyboard和block都已经出现好几个年头了,从开发效率上来看,这俩东西再配合ARC上简直是倚天屠龙。

在之前的项目中,回调需要做以下几步:

  1. A类中声明ProtocolA协议及协议下的方法。

  2. A类中声明delegate属性。

  3. B类实现ProtocolA协议以及协议下的方法,并将自身对象赋值给A类对象的delegate属性。

当需要实现回调的时候,直接通过A类对象的delegate属性调用 ProtocolA协议下的方法即可执行B类中对该协议方法的实现。

以前大伙都在这样乐呵乐呵的写,但是有了block之后,步骤变得简单了许多。

用block做回调省了哪些事儿?

  1. 不用定义协议及协议方法。

  2. 减少冗余,即不需要为回调而创建B并实现协议方法。

  3. 闭包特性,使的代码更为紧凑,表达更为直观,即不需要把业务逻辑分散到多个方法中。

废话少说,上代码。

 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;
}