iOS图片下载有一个很好的第三方框架,那就是使用非常广泛的SDWebImage,这里给大家介绍的是iOS原生的系统下载图片的方法。以后再介绍一下SDWebImage的使用。
新建一个文件ImageDownloadDelegate继承自NSObject,我们将图片下载的方法封装在这个文件中。
.h文件:
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@protocol ImageDownloadDelegate <NSObject>
//声明一个协议,代理对象执行协议方法时讲参数传递过去
- (void)imageDownloadDidfinishDownloadImage:(UIImage *)image;
@end
typedef void(^ImageDownloadBlock) (UIImage *image);
@interface ImageDownloader : NSObject
//声明一个代理属性
@property (nonatomic, weak)id<ImageDownloadDelegate> delegate;
//声明一个block属性
@property (nonatomic, copy)ImageDownloadBlock block;
@property (nonatomic, strong)NSURLResponse *response;
@property (nonatomic, strong)NSError *error;
#pragma mark --动态方法--
//异步
- (void)downloadImageWithURL:(NSString *)urlString;
#pragma mark --静态方法--
//同步下载图片
+ (UIImage *)downloadImageWithURL:(NSString *)urlString;
//异步下载图片
//代理
+ (void)downloadImageWithURL:(NSString *)urlString delegate:(id<ImageDownloadDelegate>)delegate;
//block
+ (void)downloadImageWithURL:(NSString *)urlString block:(ImageDownloadBlock)block;
@end
.m文件:
#import "ImageDownloader.h"
@implementation ImageDownloader
- (void)downloadImageWithURL:(NSString *)urlString{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
UIImage *image = [UIImage imageWithData:data];
self.response = response;
self.error = connectionError;
//代理和block任选一种
// if (_delegate &&[_delegate respondsToSelector:@selector(imageDownloadDidfinishDownloadImage:)]) {
// [_delegate imageDownloadDidfinishDownloadImage:image];
// }
self.block(image);
}];
}
+ (UIImage *)downloadImageWithURL:(NSString *)urlString{
//创建url对象
NSURL *url = [NSURL URLWithString:urlString];
//创建请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//请求图片
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
UIImage *image = [UIImage imageWithData:data];
return image;
}
//代理异步请求
+ (void)downloadImageWithURL:(NSString *)urlString delegate:(id<ImageDownloadDelegate>)delegate{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
UIImage *image = [UIImage imageWithData:data];
//如果代理对象不为空,并且代理对象实现了协议方法,才有传递图片的意义
if (delegate != nil && [delegate respondsToSelector:@selector(imageDownloadDidfinishDownloadImage:)]) {
[delegate imageDownloadDidfinishDownloadImage:image];
}
}];
}
//block
+ (void)downloadImageWithURL:(NSString *)urlString block:(ImageDownloadBlock)block{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
UIImage *image = [UIImage imageWithData:data];
//block将参数传递出去
block(image);
}];
}
@end
在调用的文件中导入文件、遵循代理并设置属性:
#import "ImageDownloader.h"
@interface ViewController ()<ImageDownloadDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imgView;
@property (nonatomic, strong)ImageDownloader *idler;
@end
调用:
- (IBAction)imageDownloader:(id)sender {
//同步
//_imgView.image = [ImageDownloader downloadImageWithURL:IMG_URL];
// 异步:代理
[ImageDownloader downloadImageWithURL:IMG_URL delegate:self];
//异步:block
// [ImageDownloader downloadImageWithURL:IMG_URL block:^(UIImage *image) {
// _imgView.image = image;
//
// }];
self.idler = [[ImageDownloader alloc]init];
[self.idler downloadImageWithURL:IMG_URL];
//self.idler.delegate = self;
__weak typeof(self) temp = self;
self.idler.block = ^(UIImage *image){
temp.imgView.image = image;
};
}
//实现协议方法(获取参数)
- (void)imageDownloadDidfinishDownloadImage:(UIImage *)image{
_imgView.image = image;
NSLog(@"%@", self.idler.response.MIMEType);
}