前面的博客中提到过回调的概念,是在OC通过协议来实现的回调,和Java中的接口的回调极为相似,下面来介绍另一种方法回调模式: Target-Action回调。首先我们来从字面意思来理解一下Target-Action回调模式,Target目标即我们要调用哪个目标对象中的方法。Action是行为的意思,就是我们要调用目标对象中的哪一个方法。委托回调模式之前在Java中接触过,而Target-Action回调模式笔者是第一次接触,可能是笔者道行太浅,感觉这是OC中对回调的新用法,感觉还行,不难理解。

还是那句话,废话少说,用代码说问题最为直接了。下面代码是笔者根据自己的理解写的的测试demo,不足之处还请批评指正,转载或者引用请注明出处。

在做测试的Project中,我们需要用到一个Controler和两个组件ComponentOne和ComponentTwo。为了体现出Target-Action回调模式,我们需要在组件中通过Target-Action回调模式来回调Controler中每个组件所对应的方法。为实现在组件中的回调,我们需要Controler在组件中进行注册,不然就找不到target对象和回调的方法啦。

为了作对比,在组件1中回调的方法是不带参数的,而在组件2中回调的方法是带参数的。可能到这读者看来上面的内容感觉有点抽象,看代码来的最为直接,代码走起~

1.首先我们先编写我们的组件1,在组件1中回调的Controler方法是不带参数的

组件1中的接口:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//
//  ComponentOne.h
//
#import <Foundation/Foundation.h>
@interface ComponentOne : NSObject
//记录target和action的属性
@property (nonatomic, strong) id target;
@property (nonatomic, assign) SEL action;
 
//声明目标动作注册方法
-(void) addTarget : (id)target Action : (SEL)action;
 
//组件一的启用方法
-(void) start;
 
@end

组件1的实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//
//  ComponentOne.m
//
 
#import "ComponentOne.h"
 
@implementation ComponentOne
//实现组件中的注册方法
-(void)addTarget:(id)target Action:(SEL)action
{
    self.target = target;
    self.action = action;
}
//实现组件的启动方法
-(void)start
{
    //回调target对象中的action方法
    [self.target performSelector:_action];
}
@end

代码说明:

1.属性target用于接收Controler的对象,也就是要回调的目标对象。

2.属性action用于接收目标对象的方法,也就是要在目标对象中要回调的方法

3.addTarget: Action:方法用于注册目标动作,说白了目标对象和目标对象的方法是通过这个方法传入到组件中的

4.start函数负责回调目标对象中的方法

2.组件1完事以后我们就开始编写我们的组件2啦,组件2和组件1中唯一不同的地方是回调的方法需要组件2提供参数,下面就只给出不同的部分代码:

1
2
3
4
5
//组件二的启动方法
-(void)start
{
    [self.target performSelector:self.action withObject:@"*组件二中返回的参数*"];
}

代码说明: 在回调Controler方法的时候,需要组件2提供参数,然后再回调

​3.组件写好了,接下来我们就开始装配了,下面我们就开始编写我们的Controler方法,来完成组装任务,并且给每个组件提供相应的回调方法。在每个回调方法中就开始编写我们的业务逻辑,同时也可以根据组件提供的参数来实现我们的特定业务逻辑。下面就是我们的Controler的实现部分。

​    ​装配时为了隐藏我们的组件,我们在实现文件中用延展来装配我们的组件,假定在Controler中要使用我们的组件1、2,Controler中的代码如下:

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
#import "Controler.h"
#import "ComponentOne.h"
#import "ComponentTwo.h"
//在Controler中使用ComponentOne组件和ComponentTow组件
//为了隐藏Controler内部组件,我们用延展进行组件的声明和调用
@interface Controler ()
//声明组件
@property(nonatomic, strong) ComponentOne *oneComponent;
@property(nonatomic, strong) ComponentTwo *twoComponent;
 
//声明Controler中的方法,用于组件的回调
//声明组件一中回调的方法,无惨方法
-(void)componentOneFunction;
 
//声明组件二中的回调方法,有参方法
-(void)componentTwoFunction : (NSString *)strValue;
@end
 
 
 
//-----------------------实现部分---------------------------
@implementation Controler
//进行组件的初始化并注册回调方法
- (instancetype)init
{
    self = [super init];
    if (self) {
        //给组件一分配内存空间
        self.oneComponent = [[ComponentOne alloc] init];
        //注册组件一的回调方法
        [self.oneComponent addTarget:self Action:@selector(componentOneFunction)];
        //启动组件一
        [self.oneComponent start];
         
        //给组件二分配内存空间
        self.twoComponent = [[ComponentTwo alloc] init];
        //注册组件二的回调方法
        [self.twoComponent addTarget:self Action:@selector(componentTwoFunction:)];
        //启动组件二
        [self.twoComponent start];
    }
    return self;
}
 
 
//实现controler中的回调方法
-(void)componentOneFunction
{
    NSLog(@"我是Controler中的componentOneFunction方法,我是在组件一中回调使用的");
}
 
-(void)componentTwoFunction:(NSString *)strValue
{
    NSLog(@"我是Controler中的componenTwoFunction方法,我的参数%@是从组件二中回调时获取的", strValue);
}
 
@end

​    ​代码说明:

​    ​    ​    ​1.在Controler中我们声明并实例化了我们要使用的组件模块

​    ​    ​    ​2.在Controler中声明和实现组件中Controler对象要回调的方法

​    ​    ​    ​3.在组件实例化后我们要再组件中注册我们要调用Controler中的那个方法。

​    ​    ​    ​4.注册后,我们就可以启动组件来测试组件功能

​4,在mian函数中我们为了测试,把Controler进行实例化,代码如下:

1
2
//controler的实现
 Controler *controler = [[Controler alloc] init];

​    ​上面代码的运行结果如下:

1
2
2014-08-18 08:33:23.900 Test2[544:303] 我是Controler中的componentOneFunction方法,我是在组件一中回调使用的
2014-08-18 08:33:23.902 Test2[544:303] 我是Controler中的componenTwoFunction方法,我的参数*组件二中返回的参数*是从组件二中回调时获取的

​    ​    ​

​上面所有的代码是笔者根据个人理解Target-Action回调模式来设计的样例,因水平有限,避免有偏颇之处。希望大家批评指正,还是那句话,如需转载请注明出处。

Target-Action回调模式的更多相关文章

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

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

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

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

  3. .net之微信企业号开发(三) 回调模式的接口开发

    一.前言 微信企业号应用中,有两种模式,一种是普通模式,这种模式只能进行简单网页链接,以及发送固定的消息.为了可以让企业号的用户更好的与应用交互,微信提供了回调模式,这种回调模式的可以将用户发送给微信 ...

  4. 用c#开发微信(1)服务号的服务器配置和企业号的回调模式 - url接入 (源码下载)

    最近研究了下服务号的服务器配置和企业号的回调模式.真正实现完后,觉得很简单,但一开始还是走了点弯路,所以写了个web程序,只用改下配置文件里的参数就可以直接用了.下面介绍下详细的用法以及实现步骤. 本 ...

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

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

  6. AFHTTPClient的异步回调模式

    以前第一个版本,ios的http都用的同步模式,在很多地方会导致线程阻塞,自己开发了一个简易的AFHTTPClient的异步回调模式. 回调的protocol: @protocol MyAFNetwo ...

  7. rpyc 回调模式工作不正常

    rpyc 回调模式工作不正常 最近使用了 rpyc 来处理一个多节点间的文件同步的任务,目标是使用 rpyc 来实现简单的 p2p 文件传输机制,以减少单点负载和单点失败对传输的影响. 和 p2p 的 ...

  8. JavaScript学习笔记(十二) 回调模式(Callback Pattern)

    函数就是对象,所以他们可以作为一个参数传递给其它函数: 当你将introduceBugs()作为一个参数传递给writeCode(),然后在某个时间点,writeCode()有可能执行(调用)intr ...

  9. 如何用php开启企业微信开发的回调模式

    猜想: 懵逼 实践: 微信公众号开发的手册中甚至给出了只需要修改几个参数就能使用的范例.企业微信开发中在一个很不显眼的地方放了一个sample. https://work.weixin.qq.com/ ...

随机推荐

  1. SQL Server 2008中的代码安全<转>

    一:存储过程加密与安全上下文 二:DDL触发器与登录触发器 三:通过PassPhrase加密 四:主密钥 五:非对称密钥加密 六:对称密钥加密 七:证书加密 八:透明加密(TDE) 将 TDE 保护的 ...

  2. Hibernate criteria 增加排序项

  3. String对象方法扩展

    /** *字符串-格式化 */ String.prototype.format = function(){ var args = arguments;//获取函数传递参数数组,以便在replace回调 ...

  4. 利用闭包实现多次ajax请求只执行最后一次

    点一个按钮,则向服务器请求资源,不作处理时,多次点击后会有很多个请求在等待.我们知道一般我们用ajax是异步请求,那么我们快速重复点击一个按钮得到的结果其实我们并不知道是哪次点击的结果可能是第一次可能 ...

  5. Windows 下的 Redis 的启动

    1. 首先需要去下载Windows 版本的Redis,地址:https://github.com/MSOpenTech/redis, 这里你可以选择下载源码后自己编译,也可以直接下载发布后的版本,我是 ...

  6. Twitter面试题蓄水池蓄水量算法(原创 JS版,以后可能会补上C#的)

    之前在群里有人讨论Twitter的面试题,蓄水池蓄水量计算,于是自己写了个JS版的(PS:主要后台代码还要编译,想想还是JS快,于是就使用了JS了.不过算法主要还是思路嘛,而且JS应该都没问题吧^_^ ...

  7. Web方式预览Office/Word/Excel/pdf文件解决方案

    最近在做项目时需要在Web端预览一些Office文件,经过在万能的互联网上一番搜索确定并解决了. 虽然其中碰到的一些问题已经通过搜索和自己研究解决了,但是觉得有必要将整个过程记录下来,以方便自己以后查 ...

  8. Linux 部署ASP.NET SQLite 应用 的坎坷之旅 附demo及源码

    Linux 部署ASP.NET SQLite 应用 的坎坷之旅.文章底部 附示例代码. 有一台闲置的Linux VPS,尝试着部署一下.NET 程序,结果就踏上了坑之路,不过最后算是完美解决问题,遂记 ...

  9. 初试Office 365企业版E3

    Microsoft Office 365 团队给了所有现任的MVP 12个月的微软 Office 365 企业 E3 订阅,今天激活账号并试用了一下,发现非常强大,本文简要介绍下Office 365 ...

  10. 基于Entity Framework 6的框架Nido Framework

    随着 Entity Framework 最新主版本 EF6 的推出,Microsoft 对象关系映射 (ORM) 工具达到了新的专业高度,与久负盛名的 .NET ORM 工具相比已不再是门外汉. EF ...