• 从OC和C#中找乐趣:相同又不同的delegate


      不想说话,本来第一段打了一大堆废话,结果浏览器崩溃了。。。直接进入正题吧。看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(1000);//模拟网络请求一秒
    
                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

  • 相关阅读:
    Linux常用命令英文全称与中文解释
    输入一个URL之后发生了什么?
    四种基本的数据结构
    关于深拷贝
    TCP的三次握手和四次挥手
    利用正则表达式去掉字符串的前后空格
    用canvas画一个等腰三角形
    三种隐藏元素方法的区别
    消息中间件-activemq安全机制
    Netty学习(十)-Netty文件上传
  • 原文地址:https://www.cnblogs.com/panzi/p/5364256.html
Copyright © 2020-2023  润新知