在 IOS 的数据回调或者说代理模式大都都是通过回调函数或者Block(代码块)来实现的,Block 没什么好讲的,语法而已,这里简单理解下回调函数的工作原理。
(这个回调函数的工作原理实际上的也是代理模式的过程)
一、代理类的实现
首先,新建一个代理类,并在其中写一个协议:AgencyProtocol
@protocol AgencyProtocol <NSObject> - (void)cometrueSuccess:(NSString *)str; - (void)cometrueFail:(NSString *)str; @end
然后在代理类中操作:
- 引入 AgencyProtocol 协议,并且定义一个AgencyProtocol协议的代理(delegate);
- 对该代理类使用单例模式(一般代理类使用单例模式比较好,可以防止内存泄露);
- 实现一个代理方法;
.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 文件中操作
- 创建一个代理类的对象;
- 将使用类赋给代理类的 delegate;
- 使用代理方法
//使用代理类 // 创建一个代理类的对象 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-10-09 14:52:23