不想说话,本来第一段打了一大堆废话,结果浏览器崩溃了。。。直接进入正题吧。看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 { }