[TwistedFate]图片异步加载,KVO
2015-12-05 14:46
190 查看
异步下载图片
自定义类imageDownLoader类
思路:- 异步下载图片首先需要一个网址字符串 (需要传入一个字符串)
- 加载完图片数据需要将一个data传给controller显示(代理传值)
- 考虑到异步加载可能成功,也可能失败
代码实现:
- 定义协议
// 创建一个协议 @protocol ImageDownLoadDelegate <NSObject> // 请求成功 - (void)imageDownLoadSucceedWithData:(NSData *)data; // 请求失败 - (void)imageDownLoadFailedWithError:(NSError *)error; @end
初始化需要的属性及方法
@interface ImageDownLoader : NSObject // 连接 @property (nonatomic, retain) NSURLConnection *connection; @property (nonatomic, retain) NSMutableData *data; @property (nonatomic, assign) id<ImageDownLoadDelegate> delegate; // 自定义初始化 - (instancetype)initWithUrl:(NSString *)url delegate:(id<ImageDownLoadDelegate>) delegate; // 申明开始的方法 - (void)imageDownLoadStart; // 终止方法 - (void)imageDownLoadCancel; @end
方法实现
// 初始化方法(需要写请求中 可能用到的参数网址) - (instancetype)initWithUrl:(NSString *)url delegate:(id<ImageDownLoadDelegate>) delegate{ self = [super init]; if (self) { // 设置代理 self.delegate = delegate; // 创建一个网址对象 NSURL *newUrl = [NSURL URLWithString:url]; // 根据网址创建一个请求 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:newUrl cachePolicy:(NSURLRequestUseProtocolCachePolicy) timeoutInterval:30]; // 创建链接(异步代理) self.connection = [NSURLConnection connectionWithRequest:request delegate:self]; //[self.connection start]; } return self; }
代理方法实现
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ self.data = [NSMutableData data]; } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ [self.data appendData:data]; } - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ // 图片请求完成+ if (_delegate != nil && [_delegate respondsToSelector:@selector(imageDownLoadSucceedWithData:)]) { // 调用 协议中的方法 [_delegate imageDownLoadSucceedWithData:self.data]; } } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ if (_delegate != nil && [_delegate respondsToSelector:@selector(imageDownLoadFailedWithError:)]) { [_delegate imageDownLoadFailedWithError:error]; } } - (void)imageDownLoadStart{ [self.connection start]; } - (void)imageDownLoadCancel{ [self.connection cancel]; }
KVO键值观察者
1.创建一个被观察者类ManModel// 创建一个对象 self.man = [[ManModel alloc] init]; self.man.money = @"121312"; /** * KVO键值观察者 * 观察model中的某一个属性 值的变化 * 如果这个属性的值 发生变化 会触发一个方法 * 明确: * 1.观察者 (控制器中触发一个方法 -- 比如改变视图的颜色) * 2.被观察者 (man) * 3.观察的属性 (对象中的 money这个属性) * 控制器作为观察者 去观察 model(被观察者)中的一个属性的值的变化 会触发一个方法(往往是改变视图的) * 观察者(Controller) * 被观察者(Model) * Model 发生变化 去改变 视图(V) */ // 添加一个观察者 // 被观察者 man // Observer 填观察者 // keyPath 填属性名 // NSKeyValueObservingOptionOld原有值 // NSKeyValueObservingOptionNew新值 // context携带参数 [self.man addObserver:self forKeyPath:@"money" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:@"haha"];
添加一个button点击改变man的money值
- (void)click:(UIButton *)button{ self.man.money = @"das"; }
被观察者改变触发的方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{ // 哪个属性发生了变化 NSLog(@"%@",keyPath); // object被观察的对象 NSLog(@"%@",object); // change值的变化 NSLog(@"%@",change); // context携带的参数 NSLog(@"%@",context); // 移除观察者 [object removeObserver:self forKeyPath:keyPath]; }
相关文章推荐
- pycharm 中文
- mac vim 使用记录
- 教你如何配置Ubuntu用于高效、高质量的发送邮件
- IOS 高效利用Xcode
- Spark核心概念
- Servlet生命周期和JSP
- cookie 和session 的区别详解
- 重定向和MySql插入中文
- dede 两个网站共用一个数据库图片路径问题
- web性能测试基本性能指标
- 动态规划--最长递增子序列
- String家族--String、StringBuffer、StringBuilder
- ACM-ICPC Live Archive Regionals 2014 >> 重拾2014上海区域赛
- Unity3D_NGUI_安卓APK安装包瘦身实践
- http和servlet输出
- Git 服务器 配置
- WaitForSingleObject http://www.cnblogs.com/shootingstars/archive/2004/07/15/24602.html
- trunc函数
- ubuntu 下安装 activate-power-mode
- 153.Oracle数据库SQL开发之 JAVA——导入JDBC包