美文网首页
Delegate 代理

Delegate 代理

作者: 借缕春风绽百花 | 来源:发表于2020-06-24 16:48 被阅读0次

什么是代理?

代理类似于生活中的中介机构,当某人有一个租房买房等需求时,某人找到中介,告诉中介自己的身份和联系方式,然后让中介执行他的租房买房能力,中介将房子找好以后,通过之前记录的雇主信息找到雇主,将找到的房子交给雇主。这样的流程就叫代理。

代理的使用

这里我们以一个人去租房为例
1.创建一个Person类用于调用代理即中介去租房,该类有一个向中介发起租房任务的方法needHouse和一个接收中介返回房子信息的方法receiveHouse

-(void)needHouse{
    
}
-(void)receiveHouse:(NSString *)house{
    
}

2.创建一个代理类Agent,用于充当代理去实现租房需求,该类有一个租房的方法rentHouse和一个Person类对象p,p用于记录调用该代理得人。

@property (nonatomic,strong)Person *p;
-(void)rentHouse{
   
    
}

3.在Person类中实现对代理类的调用

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.p = self;
    //3.让中介去租房子
    [agent rentHouse];
    
}

4.在Person类中实现接收中介返回信息的方法receiveHouse

-(void)receiveHouse:(NSString *)house{
    NSLog(@"接收到房子%@了",house);
}

5.在Agent类中实现rentHouse方法,并把结果通过调用Person的接收方法receiveHose返回给调用者。

-(void)rentHouse{
    NSLog(@"正在找房。。。。。。。。。。。。。");
    //返回数据给雇主
    [self.p receiveHouse:@"湖畔之梦小区"];
    
}

6.在主函数main中导入Person类,并发起租房。

 //1.实例化Person类
        Person *zwf = [Person new];
        //2.调用Person类的租房方法
        [zwf needHouse];

7.运行结果


加入协议

上文中,单个随想调用代理比较方便,可代理不是为一个对象服务,当多个对象都要调用代理时,为应对每个对象的,代理需要调用不同的结果返回方法将处理结果返回给调用方。这里就引入了协议概念,每个对象要调用中介,都要遵循代理规定的协议,使用协议规定的接收方法接收代理返回值。
1.在Agent内制定一个协议,该协议内有一个接收数据的方法;声明一个遵循协议的任意对象类型属性变量用于接收雇主信息。为了保证调用者在遵守协议却没有实现协议而导致的运行时程序崩溃的问题,在代理实现文件中加上判断调用者是否实现了协议所需的方法,若实现了再返回数据给调用者。

@protocol rentHouseProtocol <NSObject>
//返回房子给雇主的方法
-(void)ceceiveHouse;

@end

@interface Agent : NSObject
//声明一个属性变量用于记录雇主,该变量可以使任何遵循rentHousePrococol协议的对象类型
@property (nonatomic,assign)id<rentHouseProtocol> emplyer;
//租房方法
-(void)rentHouse;

@end

实现文件内

-(void)rentHouse{
    NSLog(@"正在找房。。。。。。。。。。。。。");
    //返回数据给雇主
    if([self.emplyer respondsToSelector:@selector(receiveHouse:)]){
        [self.emplyer receiveHouse:@"湖畔之梦小区"];
    }
    
    
}

2.在Person类中实现协议方法,并实现租房请求。

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.emplyer= self;
    //3.让中介去租房子
    [agent rentHouse];
    
}

- (void)receiveHouse:(nonnull NSString *)house {
    NSLog(@"接收到房子%@了",house);
}

3.在主函数实例化Person对象并发起租房请求

 //1.实例化Person类
        Person *zwf = [Person new];
        //2.调用Person类的租房方法
        [zwf needHouse];

4.上述步骤只是实现了单个对象调用代理的需求,接下来,我们再写一个Dog类,同样通过代理调用租房。在该类中同样的遵循该协议并声明租房方法。

@interface Dog : NSObject<rentHouseDelegate>

-(void)needHouse;

@end

5.在该类实现文件中实现租房请求方法和协议中的接收方法。

-(void)needHouse{
    //1.找到中介
    Agent *agent = [Agent new];
    //2.告诉中介我是谁
    agent.emplyer= self;
    //3.让中介去租房子
    [agent rentHouse];
}
- (void)receiveHouse:(nonnull NSString *)house {
    NSLog(@"dog接收到房子%@了",house);
}

6.同样的,在main函数中实例化Dog类对象并发出租房申请

Dog *dog = [Dog new];
        [dog needHouse];

7.运行结果


注意事项

1.为了防止雇主类和代理类相互引用导致循环引用,建议雇主类和代理类头文件均使用@class前项引用。

相关文章

  • iOS 逆向传值

    代理(delegate)、通知(NSNotification),block等等。 1、委托代理delegate只能...

  • iOS开发常见问题集之Delegate

    0 关键词 代理模式、delegate 1 概述 Delegate是Cocoa的精髓之一,Delegate在Coc...

  • Delegate代理

    我理解的代理就是我想做一件事,但是这件事在我的管理范围外,那我就拜托能管理操作这件事的人来做。 比如,自定义一个c...

  • Delegate 代理

    什么是代理? 代理类似于生活中的中介机构,当某人有一个租房买房等需求时,某人找到中介,告诉中介自己的身份和联系方式...

  • 代理 delegate

    代理定义 代理可以声明属性 方法 代理方内 有必须实现的方法 也有选择实现的方法 使用代理时可能出现的问题 通常代...

  • 代理(delegate)

    代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。协议:用来指定代理双方可以做什么,必...

  • UIScrollView

    常见属性: 其他属性: UIScrollView代理(delegate) 当用户开始拖拽,调用delegate的s...

  • 简单区分下delegate. NSNotifiction. Bl

    代理 代理是一对一的关系.delegate 需要定义协议方法并且实现协议方法,会使代码结构变复杂.delegate...

  • 在swift中代理和闭包的最简单用法

    1.代理delegate: 2.闭包callBack:

  • 扩展(Extension)、 代理 (Delegate)、通知(

    扩展(Extension)、 代理 (Delegate)、通知(NSNotification) 扩展(Extens...

网友评论

      本文标题:Delegate 代理

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