图片的异步下载
@property (retain, nonatomic) IBOutlet UIImageView *imageView;
//#pragma mark - 点击Button,获取图片数据
- (IBAction)buttonAction:(UIButton *)sender
{
// 1. 准备URL
NSURL *url = [NSURL URLWithString:kURL];
// 2. 创建GET方式的请求对象
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
// 3. 创建异步的请求对象,使用Block方式
__block ViewController *weakSelf = self;
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 4. 将Data转为UIImage数据
UIImage *image = [UIImage imageWithData:data];
// 5. 显示
weakSelf.imageView.image = image;
}];
}
使用代理方法,封装image的传送 (不方便)
//#pragma mark - 点击Button,获取图片数据
- (IBAction)buttonAction:(UIButton *)sender
{
// 直接使用类方法,发起网络图片数据的请求,并且还设置了delegate
[ImageDownloader imageDownloaderWithURLStr:kURL delegate:self];
}
//#pragma mark - 当图片下载完毕之后,会执行此方法
- (void)imageDownloaderDidFinishDownloadImage:(UIImage *)image
{
_image.imageView = image;
}
ImageDownloader.m
@protocol ImageDownloaderDelegate <NSObject>
@optional
// 当下载完图片之后,执行的代理方法
- (void)imageDownloaderDidFinishDownloadImage:(UIImage *)image;
@end
+ (void)imageDownloaderWithURLStr:(NSString *)urlStr
delegate:(id<ImageDownloaderDelegate>)delegate
{
// 1. 根据地址获取网络数据
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
// 2. 得到图片数据
UIImage *image = [UIImage imageWithData:data];
// 3. 将图片数据传出去
if (delegate != nil && [delegate respondsToSelector:@selector(imageDownloaderDidFinishDownloadImage:)]) {
[delegate imageDownloaderDidFinishDownloadImage:image];
}
}];
}
使用Block方法,封装image的传送
// b1. 定义Block类型
typedef void (^Result) (UIImage *image);
@interface ImageDownloader : NSObject
// b2. 声明block作为参数的方法
+ (void)imageDownloaderWithURLStr:(NSString *)urlStr
result:(Result)result;
@end
// b3. 实现带有block参数的方法
+ (void)imageDownloaderWithURLStr:(NSString *)urlStr
result:(Result)result
{
// b4. 根据地址获取图片数据
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"GET"];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
UIImage *image = [UIImage imageWithData:data];
// b5. 传递数据(调用Block,把要传递的数据作为参数)
result(image);
}];
}
//#pragma mark - 点击Button,获取图片数据
- (IBAction)buttonAction:(UIButton *)sender
{
__block ViewController *weakSelf = self;
[ImageDownloader imageDownloaderWithURLStr:kURL result:^(UIImage *image) {
weakSelf.image.image = image;
}];
}