首页 > 代码库 > IOS - 回调函数的使用

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);}

 

IOS - 回调函数的使用