美文网首页将来跳槽用
iOS开发的协议(protocol)和代理(delegate)

iOS开发的协议(protocol)和代理(delegate)

作者: Lxin_ | 来源:发表于2017-11-03 17:56 被阅读197次

开始讲之前,我们先来看一下这两个单词的意思。

protocol - n. 协议;草案;礼仪
delegate - n. 委托;代表;代理

我们称呼protocol为协议,delegate为代理(也有人称之为委托)

  1. 要搞明白协议和代理,我们首先要知道,它们解决了什么问题。

先讲一个小故事帮助大家理解。

老王开了一家公司,刚开始规模很小,所以老王一个人做所有的事情:接活、干活、交工。(从甲方那里接活,自己做完,然后交给甲方)但是后面随着规模的扩大,老王一个人就吃不消了,忙死也忙不过来了。这时候怎么办?大家都很清楚吧,招人呗!所以后面就有了小曹、小刘、小张。
这就意味着原先老王的工作按模块进行了拆分。

工作分工

转换成编程世界的模型就是这样的:业务不是很复杂的时候,我们把所有的功能都写在一个类里面,这个类暂且叫老王,理论上所有的事情和功能都可以写到这个类里面。接活方法,干活方法,交工方法......就造成了老王这个类非常的庞大和臃肿,并且容易出错。

我们招了小曹、小刘、小张,新建了小曹类、小刘类、小张类,小曹类有接活方法,小刘类有干活方法,小张类有交工方法。

仅仅这样还是不行的,因为模块开发必然就有模块分化以后模块之间的通信问题。小曹类只接活 但是接到活之后怎么办,必须及时的干活。但是小曹不能干活,所以小曹必须抛出接到活的信号,具体这个活怎么干,就不是小曹关心的了。

以上,就是协议和代理可以解决的问题,也是协议和代理出现的意义。

  1. 协议和代理是怎么使用的。

老王与小曹约定,你只管接活,我一个月给你100元,项目完成之后,给你们提成。
小曹、小刘、小张互相不认识,为了多拿提成,都与老王约定,小曹干完活马上就通知老王,老王立刻通知小刘开始干活,小刘干完之后,马上通知老王,老王立刻通知小张开始干活。
这个约定,就是协议(protocol),是双方都要遵守的规则。

smallCao.h

@protocol GetWorkDelegate <NSObject>
- (void)doSomethingAfterGetWork;
@end

@interface smallCao : UIViewController
/**
 *  delegate 是smallCao类的一个属性,weak 关键字是为了避免循环引用,<GetWorkDelegate>表示遵守DaChuDelegate协议
 */
@property (nonatomic, weak) id <GetWorkDelegate> delegate;
- (void)StartGetWork;
@end
smallCao.m

- (void)StartGetWork {
    NSLog(@"我开始接活了");
    
    sleep(2);
    
    NSLog(@"我接到活了");
    
    /**
     *  下面这句是判断 一下delegate是否实现了doSomethingAftercaiZuohaole方法
     *  如果delegate没有实现,直接[self.delegate doSomethingAfterGetWork],会crash
     */
    if ([self.delegate respondsToSelector:@selector(doSomethingAfterGetWork)]) {
        [self.delegate doSomethingAfterGetWork];
    }
}

下面看一看老王MrWang这个类里面的内容

#import "MrWang.h"
#import "smallCao.h"
#import "smallLiu.h"
#import "smallZhang.h"

@interface MrWang () <GetWorkDelegate,GetDoDelegate>

@end

@implementation MrWang

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"老王新公司成立");
    
    smallCao *xiaoCao = [[smallCao alloc] init];
    xiaoCao.delegate = self;        //说明老王充当代理的角色,负责接收到小曹发过来的信号,然后立刻通知小刘
    [xiaoCao StartGetWork];         //小曹去接活
}

- (void)doSomethingAfterGetWork {
    smallLiu *xiaoLiu = [[smallLiu alloc] init];
    xiaoLiu.delegate = self;
    [xiaoLiu StartDoWork];
}

现在,大家对于协议(protocol)和代理(delegate)的使用,明白了吧!

相关文章

网友评论

    本文标题:iOS开发的协议(protocol)和代理(delegate)

    本文链接:https://www.haomeiwen.com/subject/lpmtmxtx.html