代理扩展-隐式代理和多播代理

代理这东西,真的不想再谈了,估计是个iOS开发人员都能熟练使用,跟Notification和Block一样,都用的滚瓜烂熟了。

这里小小的谈论一下代理的扩展:隐式代理和多播代理,其实非常简单。

隐式代理:就是定义协议的属性时不用再遵守协议了,实现方法的类也不用在遵守协议了,因为协议方法定义在NSObject的分类中。

直接上代码吧,真的是十分的简单:

1、Person类的头文件:

 1 #import <Foundation/Foundation.h>
 2
 3 /**
 4  NSObject的一个分类,里面声明(代理)方法
 5  */
 6 @interface NSObject(myfenlei)
 7
 8 - (void)eat;
 9
10 @end
11
12 /**
13  定义一个类
14  */
15 @interface Person : NSObject
16
17 @property(nonatomic,copy) NSString *name;
18
19 /**
20  代理属性,不用尊守协议,因为要实现的是NSObject分类的方法
21  */
22 @property(nonatomic,weak) id delegate;
23
24 - (void)run;
25
26 @end

2、Person类的.m文件:

 1 #import "Person.h"
 2
 3 @implementation Person
 4
 5 - (void)run{
 6     NSLog(@"%@在跑步",self.name);
 7
 8     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
 9         if([self.delegate respondsToSelector:@selector(eat)]){
10             // 调用代理对象的eat方法(声明在NSObject的分类里面)
11             [self.delegate eat];
12         }
13     });
14 }
15
16 @end

3、控制器中调用Person对象的run方法,run方法里面调用代理方法:

 1 #import "ViewController.h"
 2 #import "Person.h"
 3
 4 @interface ViewController ()
 5
 6 @end
 7
 8 @implementation ViewController{
 9     Person *_per;
10 }
11
12 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
13     _per = [[Person alloc] init];
14     _per.name = @"小明";
15     _per.delegate = self; // 指定代理
16     [_per run]; // 调用方法,方法里面调用代理方法
17 }
18
19 /**
20  实现协议方法
21  */
22 - (void)eat{
23     NSLog(@"跑完了,准备吃饭呢");
24 }
25
26 @end

完事了,没有了。隐式代理就是这么的简单。其中强调一下,最最最重要的是协议方法定义在了NSObject的分类中。理解了这点,是不是很easy呢。

下面:我们再来谈谈多播代理。

多播代理和通知很像,一个对象发出消息,多个对象监听。但比通知好用:1、通知的Key容易写错;2、通知的逻辑不清晰。

思路:其实就是定义一个代理属性,只不过这个代理属性是一个数组而已,然后对外提供一个方法添加元素至这个数组中。然后调用对象方法的时候,循环遍历这个属性(数组类型)即可。理解了这点,也就很轻松了。

说了这么多,说的我自己都迷糊了,不如直接上代码来的痛快。反正代码很少,就不解释了。

1、Person类头文件:

 1 #import <Foundation/Foundation.h>
 2
 3 /**
 4  定义协议,声明方法
 5  */
 6 @protocol PersonDelegate <NSObject>
 7
 8 - (void)eatSomething;
 9
10 @end
11
12
13 @interface Person : NSObject
14
15 /**
16  添加代理的方法
17
18  @param delegate <#delegate description#>
19  */
20 - (void)addDelegate:(id)delegate;
21
22 - (void)eat;
23
24 @end

2、Person类.m文件:

 1 #import "Person.h"
 2
 3 @interface Person ()
 4
 5 /**
 6  代理成员变量,是一个数组
 7  */
 8 @property (nonatomic, strong) NSMutableArray *delegates;
 9
10 @end
11
12 @implementation Person
13
14 // 给代理数组添加元素
15 - (void)addDelegate:(id)delegate{
16     [self.delegates addObject:delegate];
17 }
18
19 // 关键方法:调用对象方法时,遍历数组,今次执行方法
20 - (void)eat{
21     for (id delegate in self.delegates) {
22         [(id)delegate eatSomething];
23     }
24 }
25
26 // 懒加载,初始化代理属性数组
27 - (NSMutableArray *)delegates{
28     if (_delegates == nil) {
29         _delegates = [NSMutableArray array];
30     }
31     return _delegates;
32 }
33
34 @end

3、好了,接下来我们看看具体是怎么使用的:

 1     OneViewController *oneVc =[[OneViewController alloc] init];
 2     TwoViewController *twoVc = [[TwoViewController alloc] init];
 3
 4     Person *per = [Person new];
 5
 6     //设置多播代理
 7     [per addDelegate:oneVc];
 8     [per addDelegate:twoVc];
 9
10     //调用代理方法
11     [per eat];

4、看到了吧,就是调用方法给代理属性(数组)中添加元素,然后调用eat方法时,遍历数组,执行方法。这里

OneViewController和TwoViewController都实现了协议里面的- (void)eatSomething;方法。
 1 // OneViewController
 2 #import "OneViewController.h"
 3
 4 @interface OneViewController ()
 5
 6 @end
 7
 8 @implementation OneViewController
 9
10 - (void)eatSomething{
11
12     NSLog(@"one");
13 }
14
15 @end
16
17 // TwoViewController.
18 #import "TwoViewController.h"
19
20 @interface TwoViewController ()
21
22 @end
23
24 @implementation TwoViewController
25
26 - (void)eatSomething{
27
28     NSLog(@"two");
29 }
30
31 @end

好了,就是这样,是不是很easy呢。

时间: 2024-10-16 16:15:39

代理扩展-隐式代理和多播代理的相关文章

啰里吧嗦式讲解java静态代理动态代理模式

一.为啥写这个 文章写的比较啰嗦,有些东西可以不看,因为想看懂框架, 想了解SSH或者SSM框架的设计原理和设计思路, 又去重新看了一遍反射和注解, 然后看别人的博客说想要看懂框架得先看懂设计模式,于是遇到了动态代理这个大坑, 写博客等于是对自己学习过程的一个回顾和总结 本文主要参考欧阳锋的10分钟看懂动态代理设计模式 二.理解和弄懂代理的前期准备 2.1.什么是代理 简单来说就是有活不自己干,让别人干, 比如你不想写作业, 让同学帮你写,然后写上自己的名字, 这个同学就是你的代理, 帮你处理一

《设计模式之禅》--代理扩展:动态代理

接上篇<设计模式之禅>--代理扩展:强制代理 动态代理就是在实现阶段不用关心代理谁,而在运行阶段才指定代理哪一个对象.相对来说,自己写代理类的方式就是静态代理 面向切面编程(AOP)核心就是采用了动态代理机制 public interface Subject { //业务操作 public void doSomething(String str); } public class RealSubject implements Subject { //业务操作 public void doSome

动态IP代理,4千万全球住宅IP代理资源!

Luminati是最近走入视线的一个代理工具.如果您有数据挖掘.seo优化.网络抓取或网络营销等业务需求,您需要通过住宅代理或移动IP网络来进行,那么Luminati住宅代理应该在您的提供商列表中. Luminati住宅代理是什么? 众所皆知,Luminati是全球最大的代理服务.但很少有人知道,Luminat住宅代理服务是最初创建所谓"居民代理"的公司.不仅如此,他们还拥有专有的专利方法. Luminati 代理服务拥有超过3500万个住宅代理和700万个移动代理,其中移动代理IP主

1.扩展方法2.接口的隐式实现和显式实现

1.扩展方法:必须写在一个静态类里面,具体见代码: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             Student s = new Stud

Linux与云计算——第二阶段 第一十一章:代理Proxy服务器架设—Squid代理服务器正向代理和客户端配置

Linux与云计算--第二阶段Linux服务器架设 第一十一章:代理Proxy服务器架设-Squid代理服务器正向代理和客户端配置 安装Squid 安装Squid来配置代理服务器. [1] 这是一个通用的转发代理配置 [[email protected] ~]# yum -y install squid [[email protected] ~]# vi /etc/squid/squid.conf # line 26: 添加一条新的ACL acl lan src 192.168.96.0/24

什么是反向代理,如何区别反向与正向代理

转自:http://blog.csdn.net/shixing_11/article/details/7106241 一直对反射代理的反向不知道如何理解,经过百度知道,再结合下面这幅图,总算弄清楚一点了.简单的说从一个局域网出来到服务端为正向,从客户端要进入一个局域网为反向 概念: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就

SQL Server代理(8/12):使用SQL Server代理外部程序

SQL Server代理是所有实时数据库的核心.代理有很多不明显的用法,因此系统的知识,对于开发人员还是DBA都是有用的.这系列文章会通俗介绍它的很多用法. 在这个系列的上篇文章里,你学习如何使用SQL Server代理作业活动监视器监视作业活动和查看作业历史.对于你的SQL Server代理作业进行实时监视和管理,作业活动管理器是个强大的工具.在这个系列的第8篇文章里,你会回顾SQL Server代理的另一个功能——运行操作系统命令行,在SQL Server外围环境运行程序.一些程序是命令行(

继承?静态代理?写一个自己的动态代理吧

[ 需求分析 ] 在我们实际开发中常常会遇到这样的问题:记录一个类的方法运行时间,以分析性能.一般我们的做法是先在类的开始记录一个开始时间,然后在类的结束记录一个结束时间,二者相减就可以获取我们想要的结果.但是很多时候这些类已经打了jar包,我们无法直接修改源码,这个时候我们应该怎么办呢? 下文使用Tank的移动需要统计时间.记录日志来模拟需求场景,假定Moveable.Tank类无法修改. interface:Moveable public interface Moveable { publi

【转】什么是反向代理,如何区别反向与正向代理

一直对反射代理的反向不知道如何理解,经过百度知道,再结合下面这幅图,总算弄清楚一点了.简单的说从一个局域网出来到服务端为正向,从客户端要进入一个局域网为反向 概念: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器. 概述: 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器