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

【IOS】委托(delegate)和协议(protocol),第1张

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函数,完成参数的回调。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/994084.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存