说说block编程和代理-委托模式
2015-03-27 11:20
155 查看
代理-委托模式是Objective-C中一种非常高效的设计模式,这种模式使得我们可以创建一个高复用性的功能型类(用于实现某个单一功能,例如网络数据请求),然后通过协议方法回调返回数据给代理人。这种模式使用了聚合替代了多继承来实现OC类多态的实现。任何类对象都可以遵循多个协议,只要实现相应的协议方法就可以了。
block是一种看起来更像C语言而非OC语言的编程方式,它允许我们使用类似C语言的函数指针将一段代码封装称为对象传递(UIView的动画大多数都使用了block这种特性),同样的在类完成某个功能之后,可以通过调用block方法实现回调的效果。从实现上而言,委托模式跟block的差别看起来并不大,都可以回调函数实现数据交互,都存在着循环引用对象的风险。但是block的使用难度要大于委托,因为我们往往在不经意之间就造成了循环引用,这种错误还非常难发现。同样的,block的功能也要比委托模式更加强大,自动捕捉变量的特性使得block看起来就像玫瑰——美丽但扎手。下面将通过一个简单的demo来演示这两种设计的功能,其中封装网络请求的LXDRequestImage委托类和解析转换网络数据为图像的LXDTransDataToImage类,然后将数据得到的图片显示在viewcontroller中间
图片地址:点击打开链接
LXDRequestImage.h
LXDRequestImage.m
LXDTransDataToImage.h
LXDTransDataToImage.m
附上程序运行图一张:
block是一种看起来更像C语言而非OC语言的编程方式,它允许我们使用类似C语言的函数指针将一段代码封装称为对象传递(UIView的动画大多数都使用了block这种特性),同样的在类完成某个功能之后,可以通过调用block方法实现回调的效果。从实现上而言,委托模式跟block的差别看起来并不大,都可以回调函数实现数据交互,都存在着循环引用对象的风险。但是block的使用难度要大于委托,因为我们往往在不经意之间就造成了循环引用,这种错误还非常难发现。同样的,block的功能也要比委托模式更加强大,自动捕捉变量的特性使得block看起来就像玫瑰——美丽但扎手。下面将通过一个简单的demo来演示这两种设计的功能,其中封装网络请求的LXDRequestImage委托类和解析转换网络数据为图像的LXDTransDataToImage类,然后将数据得到的图片显示在viewcontroller中间
图片地址:点击打开链接
LXDRequestImage.h
<span style="font-family:KaiTi_GB2312;font-size:12px;">#import <Foundation/Foundation.h> @protocol LXDRequestImageDelegate <NSObject> - (void)finishedRequest: (NSData *)receiveData; - (void)failedRequest: (NSError *)error; @end @interface LXDRequestImage : NSObject @property (nonatomic, weak) id<LXDRequestImageDelegate> delegate; - (void)startAnsyRequestWithURL: (NSString *)urlStr; @end</span>
LXDRequestImage.m
<span style="font-family:KaiTi_GB2312;font-size:12px;">#import "LXDRequestImage.h" @interface LXDRequestImage ()<NSURLConnectionDelegate, NSURLConnectionDataDelegate> @end @implementation LXDRequestImage { NSMutableData * receiveData; } - (void)startAnsyRequestWithURL: (NSString *)urlStr { NSURL * url = [NSURL URLWithString: urlStr]; NSURLRequest * request = [NSURLRequest requestWithURL: url]; NSURLConnection * connection = [NSURLConnection connectionWithRequest: request delegate: self]; if (connection) { NSLog(@"Success to request"); } else { NSLog(@"Can not link to network"); } } #pragma mark -- NSURLConnectionDelegate - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [self.delegate failedRequest: error]; } #pragma mark -- NSURLConnectionDataDelegate - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { receiveData = [NSMutableData data]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [receiveData appendData: data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection { [self.delegate finishedRequest: receiveData]; } @end </span>
LXDTransDataToImage.h
<span style="font-family:KaiTi_GB2312;font-size:12px;">#import <Foundation/Foundation.h> #import <UIKit/UIKit.h> @interface LXDTransDataToImage : NSObject typedef void(^LXDTransHandler)(UIImage * image); + (void)transDataWithData: (NSData *)data transHandler: (LXDTransHandler)transHandler; @end</span>
LXDTransDataToImage.m
<span style="font-family:KaiTi_GB2312;font-size:12px;">#import "LXDTransDataToImage.h" @interface LXDTransDataToImage () @end @implementation LXDTransDataToImage + (void)transDataWithData:(NSData *)data transHandler:(LXDTransHandler)transHandler { transHandler([UIImage imageWithData: data]); } @end</span>
附上程序运行图一张:
相关文章推荐
- 【编程素质】设计模式-代理模式(委托模式、Proxy Pattern):动态扩充对象功能
- java的委托机制 .....代理模式
- Objective-C 编程之道 iOS设计模式解析--第22章 代理
- delegate代理(委托)设计模式
- 代理模式之说说那些重复的代码事(1)
- 举例讲解Python设计模式编程的代理模式与抽象工厂模式
- 代理模式的实现 接口编程
- spring中的AOP编程及代理模式
- 【iOS开发-57】案例改进:block动画、控件的removeFromSuperview、利用layer设置圆角矩形以及代理模式运用
- java的委托机制 .....代理模式
- 观察者模式和事件委托和代理模式
- iOS监听模式系列之关于delegate(代理,委托)的学习
- 【iOS-开发】:delegate(委托、代理)模式的设置方法
- 【读书笔记】Objective-C高级编程--Block模式1
- OC-10-其他:block、protocol、代理设计模式
- 第37天(就业班) 静态代理与动态代理、oglib代理、手动实现aop编程、注解实现AOP编程、aop相关的几个注解、xml实现aop、切入点表达式、spring对aop模式
- swift 委托/代理模式
- 【Unity】使用C#中的委托类型实现代理设计模式
- 六 设计模式之代理模式(或称委托模式)
- OC中代理(委托)设计模式