iOS个人封装图片下载:Block与Delegate两种方式

iOS应用程序开发中,不少地方要用到图片下载的地方,为了不引入SDWebImage第三方还能达到目的,只能自己写一个类,用来下载图片,在此用两种方式:Block与Delegate,此中有任何不足,望大家指出,好了,直接上代码。

1.Block方式下载图片

//XQImageDownLoad.h:

#import 
#import 
//block的参数是向外界返回的值
typedef void(^XQBlock)(UIImage *image);

@interface XQImageDownLoad : NSObject
#pragma mark - 向外界提供的接口
//第一个参数:图片的URL;第二个参数:block回调
//初始化:通过block传值,传入URLstring,返回UIImage
- (instancetype)initWithString:(NSString *)URLstring block:(XQBlock)block;

//开始下载图片
- (void)startDownLoadImage;
@end
//XQImageDownLoad.m:

#import "XQImageDownLoad.h"
//延展:用来添加两个存储外界传来的值得属性
@interface XQImageDownLoad()
@property(nonatomic,strong)NSString *string;
@property(nonatomic,copy)XQBlock block;
@end

@implementation XQImageDownLoad
//实现接口方法,同时取到外界传入的值并存为自己的私有属性
- (instancetype)initWithString:(NSString *)URLstring block:(XQBlock)block
{
    self = [super init];
    if (self) {
        self.string = URLstring;
        self.block = block;
    }
    return self;
}
//实现开始下载图片方法
- (void)startDownLoadImage
{
    //异步下载图片
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.string]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error)
    {
        //多线程
        //回到主线程并把数据传给外界
        [self performSelectorOnMainThread:@selector(mainThread:) withObject:data waitUntilDone:YES];
    }];
    [task resume];
}
//data转换为UIImage,并传值给block
- (void)mainThread:(NSData *)data{
    UIImage *image = [UIImage imageWithData:data];
    //调用外界传来的block,把需要传的数据通过外界block传出去
    self.block(image);
}

@end

2.Delegate方式下载图片

//XQImageDownLoadDelegate.h

#import 
#import 
//协议
@protocol XQdelegate <NSObject>
//方法用于把最终数据(下载的图片)传到外界
- (void)XQImageDownDidFinishImage:(UIImage *)image;
@end

@interface XQImageDownLoadDelegate : NSObject
//给外界使用的接口:第一个参数为图片URL,第二个参数为遵循协议的代理
-(instancetype)initWithURLString:(NSString *)URLString delegate:(id)delegate;
//开始下载图片
- (void)startDownLoadImage;
@end
//XQImageDownLoadDelegate.m

#import "XQImageDownLoadDelegate.h"
//延展
@interface XQImageDownLoadDelegate ()
//两个私有属性
@property(nonatomic,weak)iddelegate;
@property(nonatomic,strong)NSString *string;
@end

@implementation XQImageDownLoadDelegate
//实现接口方法,并把传入的值赋给自己的私有属性,便于内部使用
-(instancetype)initWithURLString:(NSString *)URLString delegate:(id)delegate{
    self = [super init];
    if (self) {
        self.string = URLString;
        self.delegate = delegate;
    }
    return self;
}
//实现开始下载图片的方法
- (void)startDownLoadImage
{
    //异步下载图片
    NSURLSession *session = [NSURLSession sharedSession];
    NSURLSessionDataTask *task = [session dataTaskWithRequest:[NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.string]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
        //返回主线程中把数据传出去
        [self performSelectorOnMainThread:@selector(mainThread:) withObject:data waitUntilDone:YES];
    }];
    [task resume];
}
- (void)mainThread:(NSData *)data{
    UIImage *image = [UIImage imageWithData:data];
    //用外界传入的代理调用协议方法,从而实现在外界实现协议方法时获取到需要的数据
    [self.delegate XQImageDownDidFinishImage:image];
}

@end

这是我设计的简单界面,点击开始加载图片开始加载:

iOS个人封装图片下载:Block与Delegate两种方式_第1张图片

去控制器调用两个方法:

//ViewController.m中的调用

//点击按钮时调用的方法
- (IBAction)ButtonAction:(id)sender {
#pragma mark - 封装block方法
 /*
 此处WWW知识我随意找的一张图片,并将链接宏定义
 #define WWW @"http://img02.tooopen.com/images/20151229/tooopen_sy_153068856883.jpg"
 */
 //block中不要使用self,防止循环引用
    __weak typeof(self)weakSelf = self;

    XQImageDownLoad *xqImage = [[XQImageDownLoad alloc]initWithString:WWW block:^(UIImage *image) {

        weakSelf.imV.image = image;
    }];

    [xqImage startDownLoadImage];

#pragma mark - 封装delegate方法
//记住遵循代理
    XQImageDownLoadDelegate *xqImage = [[XQImageDownLoadDelegate alloc]initWithURLString:WWW delegate:self];
    [xqImage startDownLoadImage];
}
//XQdelegate中的方法
- (void)XQImageDownDidFinishImage:(UIImage *)image{
    self.imV.image = image;
}

结果截图:

iOS个人封装图片下载:Block与Delegate两种方式_第2张图片

你可能感兴趣的:(iOS总结)