【IOS】委托(delegate)和协议(protocol)

iOS的委托模式之前也接触过,总觉得自己理解的不够透彻,使用时磕磕绊绊,今天做一个有关协议和委托模式的总结

协议(protocol)

由于Objective_C的类不支持多继承,而类在实现时很多相似的方法,所以我们把某个类应该实现的一系列方法定义在一个叫协议(Protocol)的特性里面,若某类遵循了此协议(Protocol),就可以实现该协议(Protocol)里包含的方法,但并不一定要全部实现Protocol里声明的方法,其方法的实现一般都是可选的(@optional),若检查@optional的方法是否实现,可以用“respondsToSelector”来判断是否实现。
协议提供了一套编程接口,给调用者实现协议中的方法。其使用与JAVA 的接口类似。

委托模式

最常见的协议用途是实现委托(delegate)模式,委托模式的主旨就是定义一个接口,通过该接口可以实现对象间的通信,也就是说,一个对象想让另一个对象)回传信息,则需遵循此接口,委托给另一个对象,作为委托对象的另一个对象,可以给其委托对象回传信息,一张图解释delegate:在这里插入图片描述
委托模式的使用场景:实现不同页面间的数据交互,可以用在页面跳转,界面传值,跳转页面刷新数据以及监听事件等等,当delegate的事件触发时,delegate才会被调用。
下面以代码片段为例,详细讲解委托模式;
在LDDataItemModel.h文件,分别声明协议和声明属性,在协议里调用updateDatas函数,该函数不存在LDDataItemModel类中,但LDDataItemModel类想使用该函数,只能使用委托的形式,成为代理人。


//
//  LDDataModel.h
//  WeiBo_Demo
//
//  Created by    on 2022/1/6.
//

#import <Foundation/Foundation.h>
@class LDDataItemModel;

NS_ASSUME_NONNULL_BEGIN


@protocol LDDataModelDelegate <NSObject>//协议机制

- (void)updateDatas;

@end


@property (nonatomic, weak  ) id<LDDataModelDelegate> delegate;//委托协议

- (void)requestData;

@end



LDTableViewController.m文件里有updateDatas函数,接收LDDataModel的委托,成为委托方,并签订协议

@interface LDTableViewController () <UITableViewDelegate, UITableViewDataSource,LDDataModelDelegate>

委托方指定代理人

- (LDDataModel *)datamodel
{
    if (!_datamodel) {
        _datamodel = [[LDDataModel alloc] init];
        _datamodel.delegate = self;
    }
    return _datamodel;
}
- (void)updateDatas {
    dispatch_async(dispatch_get_main_queue(), ^{
        self.datas = self.datamodel.jsonData;
        [self.tableView reloadData];
    });
}

在 LDDataItemModel.m里调用该函数
[self.delegate updateDatas];
updateDatas函数是在LDTableViewController.m文件中声明实现,也就是LDDataItemMode委托LDTableViewController,调用updateDatas函数,完成参数的回调。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值