[objective-c] 04 - 消息机制 回调 目标-方法回调

本章主要讲解回调的概述以及具有目标-动作回调接口的组件如何使用。

1.回调

回调,也叫事件触发,在底层开发中也就是服务或中断服务。其产生过程较为复杂,所有我们在此不会展开讲解。只是单纯讲解如果配置回调。

在使用一些较为复杂,或者和用户有交互类型的组件时。我们通常需要根据组件触发的事件来做出相应的响应。

比如我们使用一个开关控制一个灯。我们在编写代码的时候并不能准确的知道开关的状态,也就无法确定灯的状态。所有我们只能在开关状态发生改变的时候,获取开关的状态且根据开关的状态对灯的状态进行改变。

这时候就需要开关有一个能反馈自身状态的机制。这种机制便成为回调机制。

我们在编程中可以通过回调机制让代码在运行的过程中捕获开关状态的改变点,从而实现对灯的控制。

回调机制具体有三种表现形式:

  1. 目标-动作回调
  2. 委托模式回调
  3. 代码块回调

下面我们展开讲解目标-动作回调。

2.目标-动作回调

目标:接收事件反馈的对象。比如开关要反馈自身状态,此时接收反馈信息的对象便成为目标。目标对象为id类型,因在设计开关时,并不知道开关的使用者是什么类型的对象。在代码中通常用target来表示目标对象。

动作:事件反馈所要触发的方法。比如开关要反馈给我状态改变的信息,在代码中的具体表现形式为,通过调用我的某个方法来进行告知。动作对象为SEL类型。

SEL类型是OC语言为存储方法名创造的变量类型。同时还创造了一个运算符,用于把一个方法名转换成一个SEL值。

SEL test = @selector(方法名);

在编程中,如果我们想使用开关,并且要根据开关状态的反馈做出不同的处理,那么我们就需要设置开关的反馈目标和反馈动作。

能够设置反馈目标和反馈动作的组件我们称为具有目标动作回调接口的组件。

3.使用具有目标动作回调接口的组件

在真实情况下,具有目标动作接口的组件都是复杂类组件。所以在本章讲解中,使用虚拟的组件来进行OC语法上的学习。

首先我们来了解两个虚拟的组件,开关和灯

灯的声明文件

@interface Light : NSObject

-(void)turnOff;//开灯
-(void)turnOn;//关灯

@end

可见灯的操作很简单,只有开灯和关灯两个方法。

开关的声明文件

typedef enum : NSUInteger {
    SwitchStateOff,//default
    SwitchStateOn,
} 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.sw.state == SwitchStateOff)
    {
        [self.light turnOn];
    }
    else
    {
        [self.light turnOff];
    }
}

@end

上段代码中我们依次做了如下事情

  • 创建了一个Room类的延展
  • 在延展中声明了灯和开关的属性
  • 在初始化方法中为组件分配内存
  • 在初始化方法中设置组件反馈的目标和反馈动作
  • 实习反馈方法中的具体处理逻辑

这样当代码开始运行,开关状态被用户改变之后,灯的状态也会随之改变。当然,这段代码是虚拟的。在之后章节中我们会接触到可以真正运行的代码。还需要同学们努力学习。

时间: 2024-10-14 06:14:44

[objective-c] 04 - 消息机制 回调 目标-方法回调的相关文章

Android消息机制Handler、Looper、MessageQueue源码分析

1. Handler Looper MessageQueue的关系 2.源码分析 下图表示了Handler.Looper.MessageQueue.Message这四个类之间的关系. Handler必须与一个Looper关联,相关Looper决定了该Handler会向哪个MessageQueue发送Message 每一个Looper中都包含一个MessageQueue Handler中的mQueue引用的就是与之关联的Looper的MessageQueue 不管Handler在哪个线程发送Mes

理解Activity中的方法回调

理解Android中Activity的方法回调 这篇文章主要介绍了理解Android中Activity的方法回调,本文用一个完整实例模拟了Activity方法回调的过程,从而加深理解Activity的方法回调思想,需要的朋友可以参考下 为什么需要方法回调? 方法回调是功能定义和功能分离的一种手段,是一种松耦合的设计思想.在JAVA中回调是通过接口来实现的.作为一种系统架构,必须要有自己的运行环境,并且要提供用户的实现接口. 下面通过实例来模拟一下Android中Activity的方法回调思想.A

MFC框架剖析和消息机制

即便是基于MFC的应用程序,建立窗口类也是会遵循如下的过程: 设计窗口类->注册窗口类->生成窗口->显示窗口->更新窗口->消息循环->消息路由到窗口过程函数处理.下面就剖析一下在MFC中是如何完成上述过程的. (1)每个应用程序都有且仅有一个应用类的全局变量theApp,全局变量先于WinMain函数进行处理. (2)WinMain函数体在APPMODUL.CPP文件中,定义如下: extern "C" int WINAPI _tWinMain(

【转】Android 消息机制

Android 消息机制 本文首先从整体架构分析了Android整个线程间消息传递机制,然后从源码角度介绍了各个组件的作用和完成的任务.文中并未对基础概念进行介绍,关于threadLacal和垃圾回收等等机制请自行研究. 基础架构 首先,我们需要从整体架构上了解一下Android线程通信都做了哪些工作.我们都知道,进程是操作系统分配资源的最小单位,一个进程中可以启动多个线程来执行任务,这些线程可以共享进程的资源但不分配资源,这里讲的资源主要是只内存资源.Android的线程间消息传递机制其实和我

C#.NET 消息机制

一.消息概述 众人周知,window系统是一个消息驱动的系统, windows操作系统本身有自己的消息队列,消息循环,它捕捉键盘,鼠标的动作生成消息,并将这个消息传给应用程序的消息队列. 余下的工作有应用程序处理消息, windows 消息机制在这儿就不再讲述,我们重点讲述应用程序的消息机制. 大家只要明白消息是由操作系统传递给应用程序的. 一副图更能详细说明: 应用程序的执行是通过消息驱动的.消息是整个应用程序的工作引擎,我们需要理解掌握我们使用的编程语言是如何封装消息的原理.1 什么是消息(

Windows消息机制详解

消息是指什么?      消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉.一个消息,是系统定义的一个32位的值,他唯一的定义了一个事件,向 Windows发出一个通知,告诉应用程序某个事情发生了.例如,单击鼠标.改变窗口尺寸.按下键盘上的一个键都会使Windows发送一个消息给应用程序. 消息本身是作为一个记录传递给应用程序的,这个记录中包含了消息的类型以及其他信息.例如,对于单击鼠标所产生的消息来说,这个记录中包含了单击鼠标时的坐标.这个记录类型叫做MSG,MSG含有来

【温故Delphi】之VCL消息机制小结

TObject消息分派 procedure Dispatch(var Message); virtual; #负责分派消息到特定VCL组件的事件处理函数 procedure DefaultHandler(var Message); virtual; #消息分类:通过子类覆盖此方法,处理窗口命令消息,窗口标准消息,VCL自行触发消息,VCL通知消息,自定义 VCL封装类的方法种类 procedure WMButtonUp(var Message: TWMButtonUp); message WM_

Android消息机制:Looper,MessageQueue,Message与handler

Android消息机制好多人都讲过,但是自己去翻源码的时候才能明白. 今天试着讲一下,因为目标是讲清楚整体逻辑,所以不追究细节. Message是消息机制的核心,所以从Message讲起. 1.Message是什么? 看一个从消息池中取出一个msg的方法: public static Message obtain(Handler h, int what, int arg1, int arg2, Object obj) { Message m = obtain(); m.target = h; m

android开发系列之消息机制

最近接触到一个比较有挑战性的项目,我发现里面使用大量的消息机制,现在这篇博客我想具体分析一下:android里面的消息到底是什么东西,消息机制到底有什么好处呢? 其实说到android消息机制,我们可能很快就会想到message/handle/looper这三个对象,没错在android里面就是通过此三个对象实现消息机制的.那么我想问的是,为什么我们需要消息机制呢?说到底就是为了更好.更流畅的用户体验,因为在app里面我们或多或少都有可能会设计到一些比较耗时的操作,这个时候如果我们只是一味的将当