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

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

  

namespace DelegateTest.PZNetRequestEvent
{ /// <summary>
/// 请求成功代理约束:参数为 object类型
/// </summary>
/// <param name="result"></param>
public delegate void RequestSuccessHandler(object result);
/// <summary>
/// 请求失败代理约束:参数也为object类型
/// </summary>
/// <param name="error"></param>
public delegate void RequestFailerHanlder(object error); }

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

        /// <summary>
/// 定义成功代理
/// </summary>
event RequestSuccessHandler RequestSuccess;
/// <summary>
/// 定义失败代理
/// </summary>
event RequestFailerHanlder RequestFailer;

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

 public interface PZNetRequestDelegate
{
void PZNetRequest_RequestFailer(object error);
void PZNetRequest_RequestSuccess(object result);
}

  init方法如下:

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

  最后,发起请求的方法

/// <summary>
/// 开始请求
/// </summary>
/// <param name="url"></param>
/// <param name="parameters"></param>
public void StartRequest(string url, Dictionary<string, object> parameters)
{
Console.WriteLine("发起请求。。。");
Thread.Sleep();//模拟网络请求一秒 if (url == "success")
{
RequestSuccess("success"); //因为注册了代理的实际方法,所以,此方法会调用代理的方法
}
else
{
RequestFailer("error");//因为注册了代理的实际方法,所以,此方法会调用代理的方法
       }
     }

  在编写一个类实现接口:

 public class PzDelegateRequestDemo : PZNetRequestDelegate
{
public void PZNetRequest_RequestFailer(object error)
{
Console.WriteLine("请求失败:" + error.ToString());
} public void PZNetRequest_RequestSuccess(object result)
{
Console.WriteLine("请求成功:" + result.ToString());
}
}

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

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

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

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

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

1.定义protocol

@protocol PZBaseRequestDelegate <NSObject>

@optional
-(void)requestSuccessWithRequest:(__kindof PZBaseRequest *)request;
-(void)requestFailedWithRequest:(__kindof PZBaseRequest *)request;
-(void)requestFailedWithNetworkUnConnected;
@end

2.request中定义代理变量delegate

@interface PZBaseRequest : NSObject

@property(nonatomic,weak) id<PZBaseRequestDelegate> delegate;

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

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

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

@interface PZHomeCostListController()<PZBaseRequestDelegate>

-(PZGetAccountListRequest *)request
{
if (_request == nil) {
_request = [[PZGetAccountListRequest alloc] init];
_request.delegate = self; //必不可少
}
return _request;
}

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

#pragma  mark network delegate
//请求成功
-(void)requestSuccessWithRequest:(__kindof PZBaseRequest *)request
{ }
// 请求失败
-(void)requestFailedWithRequest:(__kindof PZBaseRequest *)request{ }
//无网络
-(void)requestFailedWithNetworkUnConnected
{ }

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. 01-oracle限定查询-20190404

    关系型数据库和半结构化数据(xml文件) oracle12c:c代表云计算 PDB,CDB sql语句执行顺序: 第一步:from子句控制数据来源: 第二步:where子句使用限定符对数据行过滤: 第 ...

  2. GreenPlum 大数据平台--运维(一)

    .最后分析或真空或创建表或等... Select * from pg_stat_operations where schemaname='SCHEMA NAME ' and actionname in ...

  3. 【卷土重来之C#学习笔记】(三) 类型 存储和变量

    .c#程序是一组类型声明 ※C#程序或DLL的源代码是一组一种或多种类型声明 ※对于可执行程序,类型声明必须有一个包含Main方法类 ※命名空间是一种把相关的类型声明分组并命名的方法.既然程序是一组相 ...

  4. 深入理解JavaScript系列(29):设计模式之装饰者模式

    介绍 装饰者提供比继承更有弹性的替代方案. 装饰者用用于包装同接口的对象,不仅允许你向方法添加行为,而且还可以将方法设置成原始对象调用(例如装饰者的构造函数). 装饰者用于通过重载方法的形式添加新功能 ...

  5. SQL脚本整理系列一 分隔函数

    原来效果: fName Scroe 王某某 ,, 李某某 , 王某某 李某某 李某某 ,, 王某某 执行后效果: name score 李某某 李某某 李某某 王某某 王某某 王某某 王某某 王某某 ...

  6. 1、v1 与 v2的比较

    1.路由的迁移 /* --- v1 ----*/ .config(function($stateProvider){ $stateProvider .state('main', { url: '/', ...

  7. [Linq To Sql]解决join时的Collation冲突

    背景 现在两表 A:

  8. spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式

    spring+hibernate 配置多个数据源过程 以及 spring中数据源的配置方式[部分内容转载] 2018年03月27日 18:58:41 守望dfdfdf 阅读数:62更多 个人分类: 工 ...

  9. springboot从入门到精通(二)

    这一节我们一起用springboot开发一个应用程序,应用程序里的核心概念是玩家获取英雄列表上的英雄信息. 1.定义实体模型: 代码如下: package com.dota.herolist.enti ...

  10. 用单例模式解决临界区(CRITICAL_SECTION)的使用问题

    一.前言 最近,在项目中涉及到多线程访问临界资源的问题.为了保护临界资源,可以是使用互斥量或者是使用临界区.由于,我不需要在多进程中同步,又为了效率的考量,所以选择了使用临界区的方式.但是,在使用临界 ...