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函数,完成参数的回调。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)