真实开发中,网络返回的JSON 或者XML 数据中,通常不会直接包含图片,而是给出图片的URl。
因此:根据图片的URL 获取图片数据,以便UI显示。
1.创建一个request
2.建立urlConnection(获得请求数据NSData)。
3.得到请求到的数据NSdata(异步请求一般使用block 请求方法)
4.使用请求道的数据得到图片。( UIImage * image = [UIImage imageWithData:data];)
系统并未提供图片下载类
自己封装的图片下载类ImageDownloader。包括
1. 同步下载图片
2.异步下载图片 :异步下载图片无法在外界获取UImage。两种方式将UIImage传出: 使用delegate ;使用block 。
ImageDownloader 图片下载封装类
.h文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#pragma 异步下载代理
@protocol GreenDownImageDelegate <NSObject>
//设置代理方法
-(void)imageDownLoaderDownLoadDelegate:(UIImage *)image;
@end
@interface GreenDownImage : NSObject
//声明图片下载方法
#pragma mark - 同步下载
+(UIImage *)imageDownloaderDownloadWithImageURString:(NSString *)imageURL;
#pragma mark - 异步下载代理
+(void)imageDownloaderDownloadByAsynchronousWithImageURString:(NSString *)imageURL delegate:(id<GreenDownImageDelegate>)delegate;
#pragma mark - 异步下载block
#pragma mark block类型名为 ImageDownloadBlock
typedef void(^ ImageDownloadBlock) (UIImage *image);
+(void)downloadImageWithURLString:(NSString *)iamgeURL block:(ImageDownloadBlock) block;
.m文件
图片同步下载
#pragma mark - 同步下载
+(UIImage *)imageDownloaderDownloadWithImageURString:(NSString *)imageURL
{
// 根据创进来的网址字符串创建请求对象。
NSURLRequest * request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]];
// 使用data 对象接收同步请求的图片数据
NSData * data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
// 返回请求后的图片对象
return [UIImage imageWithData:data];
}
异步下载图片delegate 方法
#pragma mark - 异步下载 代理
//在block 中无法直接返回 image ,通过协议把image 传出去。
//1.定义GreenDownImage 协议,
//2.设置代理方法。-(void)imageDownLoaderDownLoadDelegate:(UIImage *)image;
//3.设置代理方法在什么时候执行。(当协议不为空,并且响应协议方法时执行此协议)
//4.使用这个方法下载图片 1.设置代理;2.最受协议;3.实现协议方法
+
(void)imageDownloaderDownloadByAsynchronousWithImageURString:(NSString *)imageURL delegate:(id<GreenDownImageDelegate>)delegate;
{
NSMutableURLRequest * request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:imageURL]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
UIImage * image = [UIImage imageWithData:data];
//如果代理对象不为空,且执行此协议方法。(传递值)
if (delegate!= nil&& [delegate respondsToSelector:@selector(imageDownLoaderDownLoadDelegate:)]) {
// 代理对象执行此方法
[delegate imageDownLoaderDownLoadDelegate:image];
}
}];
}
使用
#pragma mark 图片异步封装
- (IBAction)downloadImag:(id)sender
{
//使用异步delegate 下载图片的方法,1.设置代理
[GreenDownImage imageDownloaderDownloadByAsynchronousWithImageURString:IMAGE_URL delegate:self];
//2. 遵守协议
}
//3.实现协议方法
-(void)imageDownLoaderDownLoadDelegate:(UIImage *)image
{
_imageView.image = image;
}
异步下载图片block 方法
+(void)downloadImageWithURLString:(NSString *)iamgeURL block:(ImageDownloadBlock) block
{
NSURLRequest * request = [[NSURLRequest alloc] initWithURL:[NSURL URLWithString:iamgeURL]];
// 异步下载图片
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 从data 中获取图片对象
UIImage * image = [UIImage imageWithData:data];
// block 传值 (给block 传进image,在block 内部操作 iamge)
block(image);
}];
}