在前面的博客中提到了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回调好在哪,还得亲自使用一下才知道啊。

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

Objective-C中的Block回调模式的更多相关文章

  1. Asp.net中的ajax回调模式(ICallbackEventHandler)

    客户端回调本质上就是指通过前端的客户端脚本向服务器端传递相应的数据参数,服务器端再以接受到的参数进行查询和处理,最后将结果回传到客户端进行显示.asp.net 2.0提供了实现无刷新回调的接口ICal ...

  2. IOS开发之自定义Button(集成三种回调模式)

    前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调 ...

  3. OC3大回调模式使用总结(三)block回调

    OC 3大回调模式使用总结(三)block回调 block 又称 代码块,闭包等 是一个匿名的函数,它能够当做一个对象来使用,仅仅只是这个对象非常特殊,是一段代码,他能够保存你写的一段预备性质代码,待 ...

  4. Target-Action回调模式

    前面的博客中提到过回调的概念,是在OC通过协议来实现的回调,和Java中的接口的回调极为相似,下面来介绍另一种方法回调模式: Target-Action回调.首先我们来从字面意思来理解一下Target ...

  5. iOS开发之OC与swift开发混编教程,代理的相互调用,block的实现。OC调用Swift中的代理, OC调用Swift中的Block 闭包

    本文章将从两个方向分别介绍 OC 与 swift 混编 1. 第一个方向从 swift工程 中引入 oc类 1. 1 如何在swift的类中使用oc类    1.2  如何在swift中实现oc的代理 ...

  6. 微信企业号开发(1)WebAPI在回调模式中的URL验证

    微信回调模式的官方文档. 开发语言:C#(微信相关功能代码可以从官网下载) 首先,必须要明确几个参数,这几个参数在微信企业号中,每次调用都会使用到. 1.msg_signature:签名(已加密,加密 ...

  7. cocos2D v3.x 中action的回调block变化

    cocos2D v2.x中有带参数的回调block: id blk = [CCCallBlockN actionWithBlock:^(CCNode *node){ node.position = o ...

  8. iOS中使用block进行网络请求回调

    iOS中使用block进行网络请求回调 HttpRequest.h // // HttpRequest.h // UseBlockCallBack // // Created by Michael o ...

  9. Javascript中理解发布--订阅模式

    Javascript中理解发布--订阅模式 阅读目录 发布订阅模式介绍 如何实现发布--订阅模式? 发布---订阅模式的代码封装 如何取消订阅事件? 全局--发布订阅对象代码封装 理解模块间通信 回到 ...

随机推荐

  1. Cannot connect to the Docker daemon. Is the docker daemon running on this host?

    解决方案 docker-machine restart&&eval "$(docker-machine env default)"&&docker- ...

  2. git使用手册

    1.git常用命令 >>首先做git clone 形成本地repository: >>然后做checkout形成分支 列出所有分支  $ git branch –r 切换到新分 ...

  3. socket通信

    socket通信 一:socket基于Tcp连接,数据传输有保证 二:socket连接的建立过程: 1:服务器监听 2:客户端发出请求 3:建立连接 4:通信 三:一个简单的例子:服务器端每隔一段时间 ...

  4. 一台linux真实机实现多台Tomcat服务

    一.事前准备 ü 确保linux并未安装tomcat (这里虚拟机测试) ü 下载jdk与tomcat ① jdk-6u18-ea-bin-b01-linux-i586-20_aug_2009.bin ...

  5. jQuery模仿淘宝商品评价

    最近做项目要做个商品评价的功能,我直接就跑到淘宝那里去研究了,可看着晕晕的,还不知道他是怎么做的,于是把图抠了下来,自己写了一个,接下来就展示一下我是怎么做的,大家有不同的实现方法可要记得分享一下呀. ...

  6. C# winfrom HttpWebRequest 请求获取html网页信息和提交信息

    string result =GetRequest("http://localhost:32163/DuoBao/ajax.aspx", "time=5"); ...

  7. pyserial 16进制显示与发送

    pyserial 16进制显示与发送 http://www.centoscn.com/python/2013/0817/1320.html 十六进制显示的实质是把接收到的字符诸葛转换成其对应的ASCI ...

  8. GIT常用命令笔记

    最近在做了一个自己的项目.两个人合作的,所以需要用到版本管理工具.本来打算学一下自己搭建svn的,后来朋友推荐我用git,免费,流行,好用,逼格.所以就学习了一下.发现这个git与已经使用惯了的svn ...

  9. ENode框架Conference案例分析系列之 - ENode框架初始化

    前言 Conference案例是使用ENode框架来开发的.之前我没有介绍过ENode框架是如何启动的,以及启动时要注意的一些点,估计很多人对ENode框架的初始化这一块感觉很复杂,一头雾水.所以,本 ...

  10. Python黑帽编程2.1 Python编程哲学

    Python黑帽编程2.1  Python编程哲学 本节的内容有些趣味性,涉及到很多人为什么会选择Python,为什么会喜欢这门语言.我带大家膜拜下Python作者的Python之禅,然后再来了解下P ...