不想说话,本来第一段打了一大堆废话,结果浏览器崩溃了。。。直接进入正题吧。看Demo:

  C#里面也有delegate,我今天的目的就是模仿着OC里面的写法来写一个网络请求模拟类。先建一个“Protocol”,当然在C#里面就是一个普通的两个delegate方法。

  

  1. namespace DelegateTest.PZNetRequestEvent
  2. {
  3.  
  4. /// <summary>
  5. /// 请求成功代理约束:参数为 object类型
  6. /// </summary>
  7. /// <param name="result"></param>
  8. public delegate void RequestSuccessHandler(object result);
  9. /// <summary>
  10. /// 请求失败代理约束:参数也为object类型
  11. /// </summary>
  12. /// <param name="error"></param>
  13. public delegate void RequestFailerHanlder(object error);
  14.  
  15. }

  下面定义一个Request类,这个类就一个作用,发起网络请求,它里面有两个 event ,没错,一个就是 RequestSuccessHandler,另外一个RequestFailerHanlder

  1. /// <summary>
  2. /// 定义成功代理
  3. /// </summary>
  4. event RequestSuccessHandler RequestSuccess;
  5. /// <summary>
  6. /// 定义失败代理
  7. /// </summary>
  8. event RequestFailerHanlder RequestFailer;

  然后我们也定义一个init方法,参数就是具体的代理了。代理(接口)定义了符合 RequestSuccessHandler 和RequestFailerHandler的两个方法

  1. public interface PZNetRequestDelegate
  2. {
  3. void PZNetRequest_RequestFailer(object error);
  4. void PZNetRequest_RequestSuccess(object result);
  5. }

  init方法如下:

  1. public void init(PZNetRequestDelegate target)
  2. {
  3. //注册代理事件
  4. RequestSuccess += target.PZNetRequest_RequestSuccess;
  5. RequestFailer += target.PZNetRequest_RequestFailer;
  6. }

  最后,发起请求的方法

  1. /// <summary>
  2. /// 开始请求
  3. /// </summary>
  4. /// <param name="url"></param>
  5. /// <param name="parameters"></param>
  6. public void StartRequest(string url, Dictionary<string, object> parameters)
  7. {
  8. Console.WriteLine("发起请求。。。");
  9. Thread.Sleep();//模拟网络请求一秒
  10.  
  11. if (url == "success")
  12. {
  13. RequestSuccess("success"); //因为注册了代理的实际方法,所以,此方法会调用代理的方法
  14. }
  15. else
  16. {
  17. RequestFailer("error");//因为注册了代理的实际方法,所以,此方法会调用代理的方法
           }
         }

  在编写一个类实现接口:

  1. public class PzDelegateRequestDemo : PZNetRequestDelegate
  2. {
  3. public void PZNetRequest_RequestFailer(object error)
  4. {
  5. Console.WriteLine("请求失败:" + error.ToString());
  6. }
  7.  
  8. public void PZNetRequest_RequestSuccess(object result)
  9. {
  10. Console.WriteLine("请求成功:" + result.ToString());
  11. }
  12. }

  到这里呢,一个简单的网络请求,然后用代理处理返回结果就实现了。虽然和OC 语法有不同的地方,但我感觉还是大同小异。不过还是感谢OC的语法让我明白了C#的代理。说来真是惭愧。。。主打.NET开发的我,如今才稍微弄明白一点代理。下面我们测试一下代码

  1. static void Main(string[] args)
  2. {
  3. //new一个网络请求类
  4. PZNetRequest request = new PZNetRequest();
  5. //new 一个delegate
  6. PZNetRequestDelegate requestDelegate = new PzDelegateRequestDemo();
  7. //将delegate 传入 request 初始化
  8. request.init(requestDelegate);
  9. //开始发送请求,请求成功和失败,将在delegate中处理
  10. request.StartRequest("success", null);
  11. request.StartRequest("failer", null);
  12.  
  13. Console.Read();
  14. }

  好,运行,看一下结果吧,与预期的一致。

总结:C#里面其实有好多功能我是不曾用也不会用的,原来学学其他语言将两者相比有如此多的乐趣,下篇预告:OC的block  和 C# 的Func<>的相似之处

最后贴上部分OC 代理的代码:

1.定义protocol

  1. @protocol PZBaseRequestDelegate <NSObject>
  2.  
  3. @optional
  4. -(void)requestSuccessWithRequest:(__kindof PZBaseRequest *)request;
  5. -(void)requestFailedWithRequest:(__kindof PZBaseRequest *)request;
  6. -(void)requestFailedWithNetworkUnConnected;
  7. @end

2.request中定义代理变量delegate

  1. @interface PZBaseRequest : NSObject
  2.  
  3. @property(nonatomic,weak) id<PZBaseRequestDelegate> delegate;

3.request中调用代理方法如下。

  1. if (request.delegate && [request.delegate respondsToSelector:@selector(requestFailedWithNetworkUnConnected)]) {
  2. [request.delegate requestFailedWithNetworkUnConnected];
  3. }

4.实战应用,将request的代理设为self(xxController),xxController要实现 Protocol

  1. @interface PZHomeCostListController()<PZBaseRequestDelegate>
  2.  
  3. -(PZGetAccountListRequest *)request
  4. {
  5. if (_request == nil) {
  6. _request = [[PZGetAccountListRequest alloc] init];
  7. _request.delegate = self; //必不可少
  8. }
  9. return _request;
  10. }

5.实现代理方法即可,然后在代理方法中处理业务逻辑

  1. #pragma mark network delegate
  2. //请求成功
  3. -(void)requestSuccessWithRequest:(__kindof PZBaseRequest *)request
  4. {
  5.  
  6. }
  7. // 请求失败
  8. -(void)requestFailedWithRequest:(__kindof PZBaseRequest *)request{
  9.  
  10. }
  11. //无网络
  12. -(void)requestFailedWithNetworkUnConnected
  13. {
  14.  
  15. }

Demo下载地址:https://github.com/fanpan26/DelegateTest

从OC和C#中找乐趣:相同又不同的delegate的更多相关文章

  1. 如何在Swift的代码中使用OC的代码, 在OC的代码中使用Swift的代码?

    https://www.cnblogs.com/upliver/p/5138160.html 如何在Swift的代码中使用OC的代码, 在OC的代码中使用Swift的代码? 随着苹果公司对Swift的 ...

  2. WPF:指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效的解决方法

    文/嶽永鹏 WPF 数据绑定中绑定到ENTITY,如果把数据文件做成一个类库,在UI文件中去应用它,可能遇到下面这种情况. 指定的命名连接在配置中找不到.非计划用于 EntityClient 提供程序 ...

  3. test-output目录中找不到testng-fail.xml原因+Reportng+ant build.xml文件

    test-output目录中找不到testng-fail.xml原因: 在没有加入Reportng 报告的相关jar包前,在test-output目录下是有testng-fail.xml,后面加入了R ...

  4. ytu 1061: 从三个数中找出最大的数(水题,模板函数练习 + 宏定义练习)

    1061: 从三个数中找出最大的数 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 154  Solved: 124[Submit][Status][We ...

  5. 转:Tomcat启动过程中找不到JAVA_HOME JRE_HOME的解决方法

    转自:http://blog.sina.com.cn/s/blog_61c006ea0100l1u6.html 原文: 在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomca ...

  6. Tomcat启动过程中找不到JAVA_HOME解决方法

    在XP上明明已经安装了JDK1.5并设置好了JAVA_HOME,可偏偏Tomcat在启动过程中找不到. 报错信息如下:Neither the JAVA_HOME nor the JRE_HOME en ...

  7. 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法

    [源码下载] 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法 作者:webabcd 介绍重新想象 Wi ...

  8. 17082 两个有序数序列中找第k小

    17082 两个有序数序列中找第k小 时间限制:1000MS  内存限制:65535K 提交次数:0 通过次数:0 题型: 编程题   语言: 无限制 Description 已知两个已经排好序(非减 ...

  9. hdu 1595 find the longest of the shortest【最短路枚举删边求删除每条边后的最短路,并从这些最短路中找出最长的那条】

    find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others)    Memory Limit: 32768/32768 ...

随机推荐

  1. ABP Zero集成微信小程序登录

    首先是ABPZero的第三方登录模块,通过调用第三方的登录接口返回用户信息,再交给ABP的登录验证模块去执行对应的登录注册. 涉及的数据库表主要是这两个表,AbpUsers存储了用户信息,AbpUse ...

  2. (转)裸奔的后果!一次ssh被篡改的入侵事件

    裸奔的后果!一次ssh被篡改的入侵事件 原文:http://blog.51cto.com/phenixikki/1546669 通常服务器安全问题在规模较小的公司常常被忽略,没有负责安全的专员,尤其是 ...

  3. vue中添加util公共方法&&ES6之import、export

    vue中添加util公共方法&&ES6之import.export https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Re ...

  4. PLSQL Developer 客户端工具的安装

    安装之前先把客户端工具instantclient_12_1拷贝到一个没有中文和空格的目录中去, 比如我直接放到了D:\tools下面.注意这里需要的是32bit的. 下面开始安装PLSQL Devel ...

  5. 《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑

    在上一篇博客中(<HTTP权威指南>之HTTP相关概念详解)我们简单对HTTP相关的基本概念做了一些简单的了解,但未对HTTP连接管理的内容做一些详细的介绍.本篇博客我们就一起来看一下HT ...

  6. ElasticSearch mapping中字段属性总结

  7. React.js 小书 Lesson18 - 挂载阶段的组件生命周期(一)

    作者:胡子大哈 原文链接:http://huziketang.com/books/react/lesson18 转载请注明出处,保留原文链接和作者信息. 我们在讲解 JSX 的章节中提到,下面的代码: ...

  8. 调用sqlserver中的存储过程

    1.存储过程名 string strSQL = "usp_GetUnReturnPassports"; 2.创建数据库对象 database Database db = Datab ...

  9. C#生成二维码的内容

    生成二维码的内容 using QRCoder; // 生成二维码的内容 string strCode = this.txtQr.Text.Trim(); if (string.IsNullOrWhit ...

  10. 【学习笔记】开源日志记录工具log4j使用方法

    http://blog.csdn.net/zouqingfang/article/details/37558469 一.在MyEclipse中使用log4j的步骤比较简单,主要分为以下四个步骤: 1. ...