[objective-c] 04 - 消息机制 回调 目标-动作回调
本章主要讲解回调的概述以及具有目标-动作回调接口的组件如何使用。
1.回调
回调,也叫事件触发,在底层开发中也就是服务或中断服务。其产生过程较为复杂,所以我们在此不会展开讲解。只是单纯讲解如何配置回调。
在使用一些较为复杂,或者和用户有交互类型的组件时。我们通常需要根据组件触发的事件来做出相应的响应。
比如我们使用一个开关控制一个灯。我们在编写代码的时候并不能准确的知道开关的状态,也就无法确定灯的状态。所以我们只能在开关状态发生改变的时候,获取开关的状态且根据开关的状态对灯的状态进行改变。
这时候就需要开关有一个能反馈自身状态的机制。这种机制便成为回调机制。
我们在编程中可以通过回调机制让代码在运行的过程中捕获开关状态的改变点,从而实现对灯的控制。
回调机制具体有三种表现形式:
- 目标-动作回调
- 委托模式回调
- 代码块回调
下面我们展开讲解目标-动作回调。
2.目标-动作回调
目标:接收事件反馈的对象。比如开关要反馈自身状态,此时接收反馈信息的对象便成为目标。目标对象为id
类型,因为在设计开关时,并不知道开关的使用者是什么类型的对象。在代码中通常用target
来表示目标对象。
动作:事件反馈所要触发的方法。比如开关要反馈给我状态改变的信息,在代码中的具体表现形式为,通过调用我的某个方法来进行告知。动作对象为SEL
类型。
SEL类型是OC语言为存储方法名创造的变量类型。同时还创造了一个运算符,用于把一个方法名转换成一个SEL值。
SEL test = @selector(方法名);
在编程中,如果我们想使用开关,并且要根据开关状态的反馈做出不同的处理,那么我们就需要设置开关的反馈目标和反馈动作。
能够设置反馈目标和反馈动作的组件我们称为具有目标动作回调接口的组件。
3.使用具有目标动作回调接口的组件
在真实情况下,具有目标动作接口的组件都是复杂类组件。所以在本章讲解中,使用虚拟的组件来进行OC语法上的学习。
首先我们来了解两个虚拟的组件,开关和灯
灯的声明文件
@interface Light : NSObject-(void)turnOff; // 开灯
-(void)turnOn; // 关灯 @end
可见灯的操作很简单,只有开灯和关灯两个方法。
开关的声明文件
typedef enum : NSUInteger {SwitchStateOff, // defaultSwitchStateOn,
} SwitchState;@interface Switch : NSObject @property(nonatomic,assign,readonly)SwitchState currentState; -(void)addChangeStateTarget:(id)target Action:(SEL)action; @end
开关有一个只读属性,为当前开关的状态,其状态变量为枚举类型
- SwitchStateOff 表示关闭状态
- SwitchStateOn 表示开启状态
开关还有一个addChangeStateTarget方法,通过该方法为这个开关设置反馈对象和反馈动作,以实现让反馈对象收到开关状态的改变信息。
下面我们假设有一个房间,房间中有一个开关和一个灯。代码实现如下:
@interface Room : NSObject@end
@interface Room ()@property(nonatomic,strong) Light * aLight; @property(nonatomic,strong) Switch * aSwitch; -(void)changeState:(Switch *)s; @end @implementation Room - (instancetype)init { self = [super init]; if (self) { self.aLight = [[Light alloc] init]; self.aSwitch = [[Switch alloc] init]; //设置反馈对象和反馈方法 [self.aSwitch addChangeStateTarget:self Action:@selector(changeState:)]; } return self; } -(void)changeState:(Switch *)s { if (self.aSwitch.currentState == SwitchStateOff) { [self.light turnOn]; } else { [self.light turnOff]; } } @end
上段代码中我们依次做了如下事情
- 创建了一个Room类的延展
- 在延展中声明了灯和开关的属性
- 在初始化方法中为组件分配内存
- 在初始化方法中设置组件反馈的目标和反馈动作
- 实现反馈方法中的具体处理逻辑
这样当代码开始运行,开关状态被用户改变之后,灯的状态也会随之改变。当然,这段代码是虚拟的。在之后章节中我们会接触到可以真正运行的代码。还需要同学们努力学习。
转载于:https://www.cnblogs.com/lqios/p/4272019.html
[objective-c] 04 - 消息机制 回调 目标-动作回调相关推荐
- 消息机制学习笔记(四)—— 内核回调机制
消息机制学习笔记(四)-- 内核回调机制 要点回顾 内核调用 实验1:理解内核调用 第一步:编译并运行以下代码 第二步:修改窗口过程函数,重新运行 KeUserModeCallback 实验2:在OD ...
- Java 消息机制之回调详解
1. 概述 Java 中的回调机制是一个比较常见的机制,只是有可能在你的程序中使用得比较少,在一些大型的框架中回调机制随处可见.而在之前的博文<Java设计模式--观察者模式>及 Andr ...
- android 结束if循环_Android 消息机制(Handler + MessageQueue + Looper)
Author:CrazyWah Date:2018.03.26 CopyRight:http://crazywah.com 禁止搬运!!!禁止搬运!!!禁止搬运!!! Android的消息机制主要由H ...
- 聊一聊Android的消息机制
2019独角兽企业重金招聘Python工程师标准>>> 聊一聊Android的消息机制 侯 亮 1概述 在Android平台上,主要用到两种通信机制,即Binder机制和消息机制,前 ...
- windows消息机制详解-3
1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...
- Windows 消息机制浅析
Windows 消息机制浅析 1. Windows 的历史 中国人喜欢以史为鉴,而事实也确实是,如果你能知道一件事情的来龙去脉,往往可以更容易地理解事物为什么会表现为当前这样的现状.所以, ...
- Android消息机制Handler用法
这篇文章介绍了Android消息机制Handler用法总结,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 1.简述 Handler消息机制主要包括: Messa ...
- Android:Handler的消息机制
前言 Android 的消息机制原理是Android进阶必学知识点之一,在Android面试也是常问问题之一.在Android中,子线程是不能直接操作View,需要切换到主线程进行.那么这个切换动作就 ...
- android handler的机制和原理_一文搞懂handler:彻底明白Android消息机制的原理及源码
提起Android消息机制,想必都不陌生.其中包含三个部分:Handler,MessageQueue以及Looper,三者共同协作,完成消息机制的运行.本篇文章将由浅入深解析Android消息机制的运 ...
最新文章
- Golang 301永久重定向
- tcp前4字节消息长度_RocketMQ的消息存储格式
- 【设计模式】策略模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
- 牛客java面试题总结版(四)
- Focal Loss 论文笔记
- 为什么tomcat在eclipse中启动了,访问不了
- java的二叉树及三种遍历
- hdu 2550 百步穿杨(大水题)
- OpenCV-图像处理(29、凸包-Convex Hull)
- SQLite Developer破解 cmd 运行 reg delete HKEY_CURRENT_USER\SharpPlus\SqliteDev /v StartDate /f
- sap事务代码如何收藏_SAP仓库管理模块事务代码大全
- 服务器响应图像的生成
- Java实现Zoho Mail 发送邮件,使用hutool工具类。
- 菜菜的刷题日记 | 66.加一 Plus One
- 这篇文章就是要让你入门java多线程【多线程入门】
- Visual Studio 2017十五项新功能体验
- 实车采集的数据重建场景_苹果地图经过新一轮数据采集,重建后的它会颠覆果粉想象吗?...
- 编程番外篇:Rider体验与常用功能分享
- NLP01(自然语言处理)第一章 绪论
- 注定与众不同_没有原因的数据注定会使我们失败
热门文章
- 2021-08-05学习日记
- python web server_Python实现简易版的Web服务器(推荐)
- 线程的三种创建方式以及代码实现
- 单位内部一个计算机系统属于,2012年计算机一级MsOffice第五十九套练习题及答案解析...
- micropython stm32f103_MicroPython技术及应用定义
- 二进制求和Python解法
- linux help命令编写,Linux shell命令帮助格式详解
- 高一数学集合知识点整理_高一数学知识点总结
- aka鉴权 ims_ims 注册鉴权认证过程
- 物联网python教程慕课_物联网小白入门