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回调好在哪,还得亲自使用一下才知道啊。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏北京马哥教育

Python imports指南

来源:Python程序员 ID:pythonbuluo 声明:如果你每天写Python,你会发现这篇文章中没有新东西。 这是专为那些像运维人员等偶尔使用Pyt...

2575
来自专栏技术博客

C#简单的面试题目(六)

76.HashMap和Hashtable的区别。 答:HashMap是Hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于H...

872
来自专栏Django中文社区

博客文章详情页

首页展示的是所有文章的列表,当用户看到感兴趣的文章时,他点击文章的标题或者继续阅读的按钮,应该跳转到文章的详情页面来阅读文章的详细内容。现在让我们来开发博客的详...

4357
来自专栏一个爱瞎折腾的程序猿

常用cmd代码片段及.net core打包脚本分享

保存:set currentPath=%cd% 输出:echo %currentPath

1063
来自专栏偏前端工程师的驿站

Java魔法堂:找外援的利器——Runtime.exec详解

一、前言                                  Java虽然五脏俱全但总有软肋,譬如获取CPU等硬件信息,当然我们可以通过JNI调用...

21010
来自专栏JavaEdge

Java线程状态NEW状态RUNNABLE状态BLOCKED状态等待TIMED _WAITINGTERM_INATED等待队列锁池状态几个方法的比较疑问

NEW状态 实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态 英文翻译过来是线程还是没有开始执行。 首...

51111
来自专栏不想当开发的产品不是好测试

#测试框架推荐# test4j,数据库测试

# 背景 后端都是操作DB的,这块的自动化测试校验的话,是需要数据库操作的,当然可以直接封装方法来操作数据,那么有没有开源框架支持数据操作,让我们关注写sql语...

60812
来自专栏Python

vim显示行号、语法高亮、自动缩进的设置

1822
来自专栏C/C++基础

Linux命令(34)——vim命令

vi命令是UNIX操作系统和类UNIX操作系统中最通用的全屏幕纯文本编辑器。Linux中的vi编辑器叫vim,它是vi的增强版(vi iMproved),与vi...

1593
来自专栏北京马哥教育

3000 字 Flask 快速学习指南:从入门到开发

作者:过了即是客 Flask是一个Python编写的Web 微框架,让我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,...

6579

扫码关注云+社区

领取腾讯云代金券