异步加载图片的原理就是 当网络请求下来的数据中有图片的数据,就把图片的数据提出来 让它自己去通过ImageDownload下载 等下载好了,在把图片传给View去显示。
话不多说 上代码
第一步 :在定义的Model类中 重新声明一个属性 用来显示图片的,在这之前 一定要引入ImageDownload的头文件哦!!!
@property (nonatomic, retain) UIImage *pictureimage;// 用来显示图片的属性
第二步:因为是在MRC下 所以要重写dealloc方法 别忘了!!!
- (void)dealloc
{
[_movieId release];
[_movieName release];
[_pic_url release];
// 下面是需要release的方法
[_pictureimage release];
[super dealloc];
}
第三步 当外界执行相应的KVC方法(setValuesForKeysWithDictionary)的时候 内部会执行下面的方法 所以我们要重写这个方法 来进行图片异步加载
- (void)setValue:(id)value forKey:(NSString *)key
{
[super setValue:value forKey:key];
if ([key isEqualToString:@"pic_url"]) {
// 使用ImageDownload里面的初始化方法
ImageDownload *imagedownload = [ImageDownload imageDownloadWithURLStr:value];
// 这里面的Block方法是要等图片加载完成后执行ImageDownload里面的方法后 才会执行
__block MovieData *text = self;// 双下划线定义self 是为了防止循环引用
imagedownload.successBlock = ^(ImageDownload *imageDownload, UIImage *image){
// 将下载好的图片 赋值给创建的属性
text.pictureimage = image;
};
imagedownload.errorBlock = ^(ImageDownload *imageDownload,NSError *error){
NSLog(@"error = %@",[error localizedDescription]);
};
}
}
第四步 回到ImageDownload.m文件中 图片数据下载完成后 会执行下面的方法
// 将接收到的数据进行拼接
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// 拼接数据
[self.receiveData appendData:data];
}
// 数据下载成功后 调用外界成功的Block方法
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
UIImage *image = [UIImage imageWithData:self.receiveData];
self.successBlock(self,image);
}
// 下载失败后,同样调用外界失败的Block方法
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
self.errorBlock(self,error);
}
第五步:在View中展示下载好的图片
- (void)configuerDataWithActivity:(MovieData *)movieDate
{
self.namelabel.text = movieDate.movieName;
// 异步加载的方式加载图片
// 将下载好的图片给View中的Label显示出来
self.imagelabel.image = movieDate.pictureimage;
}
这样 就可以实现异步图片的加载了 但是还有一个问题 就是实际情况中 如果网速比较慢的话 下载好的图片不能显示出来 所以在还不是最完美的版本 ,需要引入KVO观察者
敬请期待。。。