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

 

转载于:https://www.cnblogs.com/ziyeSky/p/4132817.html

(1)普通用户端(全平台) 音乐播放核心体验: 个性化首页:基于 “听歌历史 + 收藏偏好” 展示 “推荐歌(每日 30 首)、新歌速递、相似曲风推荐”,支持按 “场景(通勤 / 学习 / 运动)” 切换推荐维度。 播放页功能:支持 “无损音质切换、倍速播放(0.5x-2.0x)、定时关闭、歌词逐句滚动”,提供 “沉浸式全屏模式”(隐藏冗余控件,突出歌词与专辑封面)。 多端同步:自动同步 “播放进度、收藏列表、歌” 至所有登录设备(如手机暂停后,电脑端打开可继续播放)。 音乐发现与管理: 智能搜索:支持 “歌曲名 / 歌手 / 歌词片段” 搜索,提供 “模糊匹配(如输入‘晴天’联想‘周杰伦 - 晴天’)、热门搜索词推荐”,结果按 “热度 / 匹配度” 排序。 歌管理:创建 “公开 / 私有 / 加密” 歌,支持 “批量添加歌曲、拖拽排序、一键分享到社交平台”,系统自动生成 “歌封面(基于歌曲风格配色)”。 音乐分类浏览:按 “曲风(流行 / 摇滚 / 古典)、语言(国语 / 英语 / 日语)、年代(80 后经典 / 2023 新歌)” 分层浏览,每个分类页展示 “TOP50 榜”。 社交互动功能: 动态广场:查看 “关注的用户 / 音乐人发布的动态(如‘分享新歌感受’)、好友正在听的歌曲”,支持 “点赞 / 评论 / 转发”,可直接点击动态中的歌曲播放。 听歌排行:个人页展示 “本周听歌 TOP10、累计听歌时长”,平台定期生成 “全球 / 好友榜”(如 “好友中你本周听歌时长排名第 3”)。 音乐圈:加入 “特定曲风圈子(如‘古典音乐爱好者’)”,参与 “话题讨论(如‘你心中最经典的钢琴曲’)、线上歌共创”。 (2)音乐人端(创作者中心) 作品管理: 音乐上传:支持 “无损音频(FLAC/WAV)+ 歌词文件(LRC)+ 专辑封面” 上传,填写 “歌曲信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值