從OC和C#中找樂趣:相同又不一樣的delegate

  不想說話,原本第一段打了一大堆廢話,結果瀏覽器崩潰了。。。直接進入正題吧。看Demo:git

  C#裏面也有delegate,我今天的目的就是模仿着OC裏面的寫法來寫一個網絡請求模擬類。先建一個「Protocol」,固然在C#裏面就是一個普通的兩個delegate方法。github

  

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;
   }

  最後,發起請求的方法atom

/// <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");//由於註冊了代理的實際方法,因此,此方法會調用代理的方法
       }
     }

  在編寫一個類實現接口:url

 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開發的我,現在才稍微弄明白一點代理。下面咱們測試一下代碼spa

 

  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<>的類似之處code

最後貼上部分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

相關文章
相關標籤/搜索