iOS——图片下载

27 篇文章 0 订阅

真实开发中,网络返回的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);
    }];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值