Objective-C系统原生图片下载方法封装

本文介绍了一个iOS图片下载的实现方案,包括同步和异步下载图片的方法,并提供了通过代理和block回调来处理完成下载后的图片展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值