网络图片申请-图片异步下载

版权所有,禁止匿名转载;禁止商业使用。

异步下载,IOS开发

1.创建Header File文件ImageHeader.h,其中添加图片地址


1 #define ImageAddr @"http://pic.nipic.com/2007-11-08/2007118192311804_2.jpg"

2.创建“开始下载”button,来实现触发事件,并在其中使用图片加载方法


 - (IBAction)startDownload:(UIButton *)sender {
     
     NSString *urlStr = ImageAddr;
     NSURL *url = [NSURL URLWithString:urlStr];
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
     [request setHTTPMethod:@"GET"];
     
     __block UIImageView *imageView = self.imageView;
     __block ViewController *ViewController = self;
     [NSURLConnection sendAsynchronousRequest:request
                                        queue:[NSOperationQueue mainQueue]
                            completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
         if (data) {
             UIImage *image = [UIImage imageWithData:data];
             imageView.image = image;
         }
         [ViewController reloadInputViews];
     }];
 }
//自定义一个ImageDownLoader类,来完成图片下载功能
 /*

 

         封装思想:

 

         像UIViewController等一样,通过便利构造器或者实例变量方法向外部提供接口,

 

         通过接口传入要处理的数据,对里边的处理方法和过程进行封装,在处理的过程中,

 

         分阶段的将得到的实例变量传入到代理方法中的变量中,并向外部开放,以便于

 

         用户通过对实例变量的赋值或者引用来将自己想要处理的数据添加到方法类中的

 

         循环中,方法承载实例变量进行各种加工处理,通过代理方法不断的向外部提供

 

         接口,给用户重新定义这些实例变量的权利,最终整个过程跑完以后,就会得到

 

         用户最终需要的数据。

 

  */

ImageDownloader.h


在.h中向外部提供接口


 #i

mport <Foundation/Foundation.h>
 #import "ImageHeader.h"
 
 @class ImageDownloader;
 @protocol ImageDownloaderDelegate <NSObject>
 
 //模仿苹果系统代理,先把类本身对象传过去
 - (void)imageDownloader:(ImageDownloader *)downloader didFinishLoading:(UIImage *)image;
 
 @end
 
 @interface ImageDownloader : NSObject
 
 + (instancetype)imageDownloaderWithURL:(NSString *)urlStr andDelegate:(id<ImageDownloaderDelegate>)delegate;
 
 @end
ImageDownloader.m
在ImageDownloader.m中将具体实现的方法和用到的参数进行封装
 #import "ImageDownloader.h"
 
 @interface ImageDownloader ()
 
 //对其要用到的方法进行封装
 - (void)downloadImageWithURL:(NSString *)urlStr;
 
 //对其用到的实例变量进行封装
 @property (nonatomic,assign) id<ImageDownloaderDelegate>delegate;
 
 @end

内部方法实现


@implementation ImageDownloader
 
 //     该方法向网络申请数据,将数据转换成图片,然后将图片传到代理方法的参数中
 - (void)downloadImageWithURL:(NSString *)urlStr {
     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];
 //        如果代理不为空并且实现代理方法,才去执行代理方法
 //        不加if两项有一项不实现,就会崩溃
                if (_delegate && [_delegate respondsToSelector:@selector(imageDownloader:didFinishLoading:)]) {
 //                   代理方法作用的对象是代理
             [_delegate imageDownloader:self didFinishLoading:image];
         }
     }];
 }

实现便利构造器方法,内部方法实现


 //    进入方法的接口,对传入的数据进行处理
 //    回想便利构造器的创建过程,内部直接创建对象,内部提供收
 //    到的参数与类中实例变量链接的场所,简单示例:
 //+ (instancetype)personWithName:(NSString *)name sex:(NSString *)sex {
 //    Person *p = [[[Person alloc] init] autorelease];
 //    p.name = name;
 //    p.sex = sex;
 //    return p;
 //}
 + (instancetype)imageDownloaderWithURL:(NSString *)urlStr andDelegate:(id<ImageDownloaderDelegate>)delegate {
     
 //    1.创建对象,为后面的对象方法提供对象
     ImageDownloader *downloader = [[ImageDownloader alloc] init];
 //    2.对传入的urlStr进行处理,将数据传入方法进行处理数据
     [downloader downloadImageWithURL:urlStr];
 //    3.将传入的代理对象赋值,
     downloader.delegate = delegate;
 //    利用便利构造器创建对象,最终返回对象
     return [downloader autorelease];
 }
ImageDownloader在ViewController类中的使用
 - (IBAction)startDownload:(UIButton *)sender {
     
      [ImageDownloader imageDownloaderWithURL:ImageAddr andDelegate:self];
 }
 
 - (void)imageDownloader:(ImageDownloader *)downloader didFinishLoading:(UIImage *)image {
     self.imageView.image = image;
 }


0 0