IOS - 回调函数的使用

在 IOS 的数据回调或者说代理模式大都都是通过回调函数或者Block(代码块)来实现的,Block 没什么好讲的,语法而已,这里简单理解下回调函数的工作原理。

(这个回调函数的工作原理实际上的也是代理模式的过程)

一、代理类的实现

首先,新建一个代理类,并在其中写一个协议:AgencyProtocol

@protocol AgencyProtocol <NSObject>

- (void)cometrueSuccess:(NSString *)str;
- (void)cometrueFail:(NSString *)str;

@end

然后在代理类中操作:

  1. 引入 AgencyProtocol 协议,并且定义一个AgencyProtocol协议的代理(delegate);
  2. 对该代理类使用单例模式(一般代理类使用单例模式比较好,可以防止内存泄露);
  3. 实现一个代理方法;

  .h 文件代码:

@protocol AgencyProtocol;
@interface AgencyClass : NSObject

@property (nonatomic, weak) id<AgencyProtocol> delegate;

// 单例模式
+ (id)shareInstance;

/**
 *  模拟代理方法
 *
 *  @param str    表示传进来的参数
 *  @param isBool 模拟判断是否执行成功:即调用协议中的哪个方法
 */
- (void)agencyFunction:(NSString *)str andBool:(BOOL)isBool;

@end

  .m 文件代码:(这里的代理实现是 回调函数 最重要的地方)

@implementation AgencyClass

#pragma mark - 单例模式
static AgencyClass *instnce;
+ (id)shareInstance {
    if (instnce == nil) {
        instnce = [[[self class] alloc] init];
    }
    return instnce;
}

#pragma mark - 代理实现
- (void)agencyFunction:(NSString *)str andBool:(BOOL)isBool {
    if (isBool) {
        // 调用 respondsToSelector 方法判断 cometrueSuccess 是否被实现,如果没有实现就去实现它
        if ([self.delegate respondsToSelector:@selector(cometrueSuccess:)]) {
            [self.delegate cometrueSuccess:str];
        }
    } else {
        // 调用 respondsToSelector 方法判断 cometrueFail 是否被实现,如果没有实现就去实现它
        if ([self.delegate respondsToSelector:@selector(cometrueFail:)]) {
            [self.delegate cometrueFail:str];
        }
    }
}

@end

二、使用类的实现

首先,我们在 .h 文件中引入该代理类,并且引入协议

#import "AgencyClass.h"

@interface ViewController : UIViewController<AgencyProtocol>

@end

然后我们可以在.m 文件中操作

  1. 创建一个代理类的对象;
  2. 将使用类赋给代理类的 delegate;
  3. 使用代理方法
//使用代理类

    // 创建一个代理类的对象
    AgencyClass *agency = [AgencyClass shareInstance];

    // 将使用类赋给代理类的 delegate;
    agency.delegate = self;

    // 使用代理方法
    [agency agencyFunction:@"真的在实现?" andBool:YES];

最后我们可以实现协议的两个方法

#pragma mark - AgencyProtocol 实现
- (void)cometrueSuccess:(NSString *)str {
    NSLog(@"%@ 是的,操作成功了!",str);
}

- (void)cometrueFail:(NSString *)str {
    NSLog(@"%@ 抱歉,操作失败了",str);
}
时间: 2024-07-30 10:13:27

IOS - 回调函数的使用的相关文章

ios 回调函数作用

//应用程序启动后调用的第一个方法 不懂的程序可以做不同的启动 //launchOption参数的作业:应用在特定条件下的不同启动参数 比如:挑战的支付宝支付 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Override point for customization after application launc

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像

iOS面向编码|iOSVideoToolbox:读写解码回调函数CVImageBufferRef的YUV图像 本文档基于H.264的解码,介绍读写Video Toolbox解码回调函数参数CVImageBufferRef中的YUV或RGB数据的方法,并给出CVImageBufferRef生成灰度图代码.方便调试.同时,还介绍了Video Toolbox解码回调中进行YUV处理时容易忽略的问题.文档定位于iOS音视频高级编程,致力于提供高参考价值的Core Video中文资料,最近也在StackO

嵌入式&amp;iOS:回调函数(C)与block(OC)传 参/函数 对比

C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(int data_i32)); callBack.c 1).在doSomeThingCount函数,对运行次数自增,并调用参数--函数. void DSTCount(void(*CallBack)(int data_i32)) { static int numb = 0; numb++; (*Call

嵌入式&amp;iOS:回调函数(C)与block(OC)回调对比

学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack)(int data_i32); 2).声明一个外部函数指针. extern CallBack myCallBackPTR; 3).声明一个doSomeThingCount函数 void DSTCount(void); callBack.c 1).定义一个函数指针 CallBack myCallBa

iOS中什么是BLOCK回调函数

1.回调函数类似通知.委托 2.回调函数声明.实现.回调可以在都一个类中,也可以把回调写到别的类中 3.在A类中声明函数,在实现函数中,达到满足的条件,回调,在B类中的回调函数会被调用,并去处理满足条件的事情 比如下载,如果下载完成,就触发回调函数,通知B类中的回调函数,传递一个下载完成的参数,B类的回调函数会根据参数       执行相应的代码,如果成功怎么样怎么样,如果失败怎么样怎么样,B类在A类下载过程中完全可以做他自己的事情. 4.例子(伪代码): A类a.h中声明 -(void)dow

Block、委托、回调函数原理剖析(在Object C语境)——这样讲还不懂,根本不可能!

开篇:要想理解Block和委托,最快的方法是搞明白“回调函数”这个概念. 做为初级选手,我们把Block.委托.回调函数,视为同一原理的三种不同名称.也就是说,现在,我们把这三个名词当成一回事.在这篇文章内,Block就是回调函数,委托也是回调函数,不再作详细的区分了.OK,Action! 那么,什么是回调函数?“回调”概念的主语是谁? 举个栗子(伪代码): 首先有个类,我们姑且称之为A类吧. A.h 文件 //声明回调函数:给指定的员工发放工资 -(void)paySalaryForStaff

UA判断打开页面的环境,然后在callBack写相应环境下的回调函数

(function(){ /* * 使用方法: * 一.引入ua.js * 二.直接调用 MobilePort 对象的属性与方法. * * MobilePort 对象 * 属性:MobilePort.back;// 数组 内容如下 * 方法:MobilePort.androidBrowser(callBack) 安卓浏览器 //callBack 回调只有在安卓浏览器下执行 * 方法:MobilePort.iosBrowser(callBack) ios浏览器 // 下面全部类似 * 方法:Mob

iOS终止函数exit

1.   exit函数 C,C++函数exit用来终止当前程序, 函数定义如下: void exit (int status); 官方说明如下: Terminates the process normally, performing the regular cleanup for terminating programs. Normal program termination performs the following (in the same order): Objects associat

回调函数的本质,就是把函数当作参数(首先要定义函数类型)

//把一个方法当作另一个方法的参数, 就是回调方法, 大家习惯称作回调函数 type   TFunType = function(i: Integer): Integer; {声明一个方法类型} function MyFun(i: Integer): Integer;        {建立类型兼容的函数} begin   Result := i*2; end; {把函数当作参数, 再定义一个函数} function MyTest(x: Integer; F: TFunType): Integer