Objective-C中的Block回调模式

        在前面的博客中提到了Block的概念和使用方法,我的感受Block最爽的用法莫过于在回调时用block。感受比委托回调和目标方法回调用着要顺手,好很差用还得读者亲自用一下才知道。若是 读者以前用过SSH框架的话,看到OC中的Block回调,会感受很是的亲切,和Java中的接口回调像极了。仍是那句话,上些Block的回调代码最为直接。下面的demo是根据笔者的理解,本身设计的一个小小的Block回调的 demo,不免会有不足之处,还望批评指正,尊重原创,转载请注明出处。闭包

        为了实现咱们的Block回调,咱们须要模拟一个组件(Component)和一个控制器(Controller)。在Component中咱们只给出代码块的声明,不进行实现,而后在Controller中进行实现,在Component中进行调用,也就是说由组件提供代码块的形式和代码块的参数,在Controller中给出业务逻辑。可能有的小伙伴看完上面的功能描述多少会有些抽象,废话少说,代码 走起!框架

        1.为了更好的理解,咱们就先写组件的接口部分,接口部分须要给出代码块的定义和声明,而后再提供一个外部代码块的入口函数,至关于前面目标方法回调的注册方法,再提供一个执行代码块的方法,组件的接口以下:函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//  ComponentBlock.h
//  Memory
//  Created by ludashi on 14-8-19.
//  Copyright (c) 2014年 Mr.li. All rights reserved.
//
 
#import <Foundation/Foundation.h>
//定义Block块类型的变量
typedef  void  (^BlockType) (NSString *parameter);
@interface ComponentBlock : NSObject
 
//声明Block类型的变量
@property (nonatomic, strong)BlockType blockDemo;
 
//接受要回调的代码块,把接受的代码块赋给成员变量blockDemo
-( void )setBlockDemoTest:(BlockType)blockDemo;
 
//执行代码块的方法
-( void )runBlock;
@end

 

        2.组件的@interface写完咱们就开始编写组件的实现部分了,组件的实现部分也挺简单的,就是实现咱们在接口中声明的方法,咱们在set方法中给block赋值,在runBlock中进行代码块的调用,组件中代码块是调用控制器中的代码块,因此称为代码块的回调,代码以下测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import "ComponentBlock.h"
 
@implementation ComponentBlock
 
-( void )setBlockDemoTest:(BlockType)blockDemo
{
     self.blockDemo = blockDemo;
}
 
-( void )runBlock
{
     self.blockDemo(@ "我是组件提供的参数" );
}
 
@end

 

    ​    ​3.组件写完之后咱们就开始写咱们的Controller方法,下面的代码是控制器中的接口部分代码,接口部分只声明了控制器启动的方法,代码以下:atom

1
2
3
4
#import <Foundation/Foundation.h>
@interface Controller : NSObject
-( void )start;
@end

 

    ​    ​4.控制器的实现部分是控制器的核心部分,为了实现组件的封装,咱们用延展来隐藏咱们组件要用到的方法,在延展中声明了咱们要使用的组件,而后再实现部分进行组件的初始化和编写组件中要调用的代码块,代码块中的参数由组件提供,而控制器只提供业务逻辑控制,在控制器中咱们须要 启动咱们要使用的组件,也就是组件中的runBlock方法。代码以下:spa

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
#import "Controller.h"
#import "ComponentBlock.h"
 
//为了实现信息的隐藏咱们用延展来声明组件
@interface Controller ()
//声明组件
@property (nonatomic, strong) ComponentBlock *component;
@end
 
 
//---------实现----------------
 
@implementation Controller
//在controller中对组件进行初始化
- (instancetype)init
{
     self = [super init];
     if  (self) {
         self.component = [ComponentBlock  new ];
         //进行代码块的回调
         [self.component setBlockDemoTest:^ void  (NSString *parameter)
         {
             //打印回调的参数
             NSLog(@ "%@" , parameter);
         }];
     }
     return  self;
}
 
-( void )start
{
     //调用组件的方法,执行代码块
     [self.component runBlock];
}
 
@end

 

    ​    ​5.Block回调的测试:在mian函数中进行控制器的实例化和启动控制器,代码以下:设计

1
2
3
4
5
6
7
@autoreleasepool {
     
     Controller *controller = [[Controller alloc] init];
     [controller start];
     
}
return  0;

 

    ​    ​代码运行结果以下:code

1
2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是组件提供的参数

    ​以上是Block回调的小demo,读者能够和前面博客中的委托回调和目标方法回调进行一个对比,具体哪个好用,就看读者我的所好了。Block是后来苹果公司对OC的扩充,就像PHP5.3之后也支持闭包了同样,在以前封装的组件都是用目标方法回调或委托回调实现的,至于Block回调好在哪,还得亲自使用一下才知道啊。component

  上面的总结暂且这么说吧,是根据笔者本身的理解所总结的内容,难免有偏颇之处,欢迎批评指正,转载请注明出处。接口

相关文章
相关标签/搜索