不想說話,原本第一段打了一大堆廢話,結果瀏覽器崩潰了。。。直接進入正題吧。看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 { }