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方法,下面的代码是控制器中的接口部分代码,接口部分只声明了控制器启动的方法,代码如下:
1
2
3
4
|
#import <Foundation/Foundation.h> @interface Controller : NSObject -( void )start; @end |
4.控制器的实现部分是控制器的核心部分,为了实现组件的封装,我们用延展来隐藏我们组件要用到的方法,在延展中声明了我们要使用的组件,然后再实现部分进行组件的初始化和编写组件中要调用的代码块,代码块中的参数由组件提供,而控制器只提供业务逻辑控制,在控制器中我们需要 启动我们要使用的组件,也就是组件中的runBlock方法。代码如下:
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; |
代码运行结果如下:
1
|
2014-08-19 17:29:08.904 OC9-Test1[2249:303] 我是组件提供的参数 |
以上是Block回调的小demo,读者可以和前面博客中的委托回调和目标方法回调进行一个对比,具体哪一个好用,就看读者个人所好了。Block是后来苹果公司对OC的扩充,就像PHP5.3以后也支持闭包了一样,在之前封装的组件都是用目标方法回调或委托回调实现的,至于Block回调好在哪,还得亲自使用一下才知道啊。
上面的总结暂且这么说吧,是根据笔者自己的理解所总结的内容,不免有偏颇之处,欢迎批评指正,转载请注明出处。
作者:青玉伏案
出处:http://www.cnblogs.com/ludashi/
本文版权归作者和共博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果文中有什么错误,欢迎指出。以免更多的人被误导。
收简历:坐标美团(北京总部),长期招聘FE/iOS/Android靠谱工程师,入职后,可内部联系楼主,有小礼品赠送,有意者可邮箱投递简历:zeluli@foxmail.com
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?