1 #define ImageAddr @"http://pic.nipic.com/2007-11-08/2007118192311804_2.jpg"
1 - (IBAction)startDownload:(UIButton *)sender { 2 3 NSString *urlStr = ImageAddr; 4 NSURL *url = [NSURL URLWithString:urlStr]; 5 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 6 [request setHTTPMethod:@"GET"]; 7 8 __block UIImageView *imageView = self.imageView; 9 __block ViewController *ViewController = self; 10 [NSURLConnection sendAsynchronousRequest:request 11 queue:[NSOperationQueue mainQueue] 12 completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 13 if (data) { 14 UIImage *image = [UIImage imageWithData:data]; 15 imageView.image = image; 16 } 17 [ViewController reloadInputViews]; 18 }]; 19 }
1 /* 2 3 封装思想: 4 5 像UIViewController等一样,通过便利构造器或者实例变量方法向外部提供接口, 6 7 通过接口传入要处理的数据,对里边的处理方法和过程进行封装,在处理的过程中, 8 9 分阶段的将得到的实例变量传入到代理方法中的变量中,并向外部开放,以便于 10 11 用户通过对实例变量的赋值或者引用来将自己想要处理的数据添加到方法类中的 12 13 循环中,方法承载实例变量进行各种加工处理,通过代理方法不断的向外部提供 14 15 接口,给用户重新定义这些实例变量的权利,最终整个过程跑完以后,就会得到 16 17 用户最终需要的数据。 18 19 */
1 #import <Foundation/Foundation.h> 2 #import "ImageHeader.h" 3 4 @class ImageDownloader; 5 @protocol ImageDownloaderDelegate <NSObject> 6 7 //模仿苹果系统代理,先把类本身对象传过去 8 - (void)imageDownloader:(ImageDownloader *)downloader didFinishLoading:(UIImage *)image; 9 10 @end 11 12 @interface ImageDownloader : NSObject 13 14 + (instancetype)imageDownloaderWithURL:(NSString *)urlStr andDelegate:(id<ImageDownloaderDelegate>)delegate; 15 16 @end
1 #import "ImageDownloader.h" 2 3 @interface ImageDownloader () 4 5 //对其要用到的方法进行封装 6 - (void)downloadImageWithURL:(NSString *)urlStr; 7 8 //对其用到的实例变量进行封装 9 @property (nonatomic,assign) id<ImageDownloaderDelegate>delegate; 10 11 @end
1 @implementation ImageDownloader 2 3 // 该方法向网络申请数据,将数据转换成图片,然后将图片传到代理方法的参数中 4 - (void)downloadImageWithURL:(NSString *)urlStr { 5 NSURL *url = [NSURL URLWithString:urlStr]; 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 [request setHTTPMethod:@"GET"]; 8 [NSURLConnection sendAsynchronousRequest:request 9 queue:[NSOperationQueue mainQueue] 10 completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 11 12 UIImage *image = [UIImage imageWithData:data]; 13 // 如果代理不为空并且实现代理方法,才去执行代理方法 14 // 不加if两项有一项不实现,就会崩溃 15 if (_delegate && [_delegate respondsToSelector:@selector(imageDownloader:didFinishLoading:)]) { 16 // 代理方法作用的对象是代理 17 [_delegate imageDownloader:self didFinishLoading:image]; 18 } 19 }]; 20 }
1 // 进入方法的接口,对传入的数据进行处理 2 // 回想便利构造器的创建过程,内部直接创建对象,内部提供收 3 // 到的参数与类中实例变量链接的场所,简单示例: 4 //+ (instancetype)personWithName:(NSString *)name sex:(NSString *)sex { 5 // Person *p = [[[Person alloc] init] autorelease]; 6 // p.name = name; 7 // p.sex = sex; 8 // return p; 9 //} 10 + (instancetype)imageDownloaderWithURL:(NSString *)urlStr andDelegate:(id<ImageDownloaderDelegate>)delegate { 11 12 // 1.创建对象,为后面的对象方法提供对象 13 ImageDownloader *downloader = [[ImageDownloader alloc] init]; 14 // 2.对传入的urlStr进行处理,将数据传入方法进行处理数据 15 [downloader downloadImageWithURL:urlStr]; 16 // 3.将传入的代理对象赋值, 17 downloader.delegate = delegate; 18 // 利用便利构造器创建对象,最终返回对象 19 return [downloader autorelease]; 20 }
1 - (IBAction)startDownload:(UIButton *)sender { 2 3 [ImageDownloader imageDownloaderWithURL:ImageAddr andDelegate:self]; 4 } 5 6 - (void)imageDownloader:(ImageDownloader *)downloader didFinishLoading:(UIImage *)image { 7 self.imageView.image = image; 8 }