iOS开发—自定义NSOperation子类下载图片

本文通过一个实例介绍了如何在iOS开发中自定义NSOperation子类进行非并发图片下载。首先创建SingleViewApplication工程,然后在Main.StoryBoard中添加ImageView并设置属性。接着创建名为DownloadOperation的类,继承自NSOperation,重写main方法,并实现下载图片的代理方法。在ViewController中,创建NSOperationQueue,设置ViewController为DownloadOperation的代理,添加自定义操作到队列中,成功实现了图片下载功能。

如果NSOperation的两个子类,NSInvocationOperation类和NSBlockOperation类无法满足需求,可以自定义一个继承自NSOperation的类。接下来通过一个下载图片的案例,展示如何使用自定义的NSOperation子类,这里暂时先介绍非并发的NSOperation,具体内容如下:

(1)新建一个SingleViewApplication工程,命名为“11-CustomNSOperation”;

(2)进入Main.StoryBoard ,从对象库中拖拽1个ImageView到程序界面,设置ImageView的Mode模式为Center,设置一个背景颜色,并且用拖拽的方式对这个控件进行属性声明;

(3)新建一个类DownloadOperation,继承于NSOperation类,表示下载操作。在DownloadOperation.m文件中,重写main方法,并且为该自定义类创建一个代理,并为该代理提供一个下载图片的方法,DownloadOperation类的声明和实现文件如下所示:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@class DownloadOperation;
//定义代理
@protocol DownloadOperationDelegate<NSObject>
//下载操作方法
-(void)downloadOperation:(DownloadOperation *)operation
image:(UIImage *)image;
@end
@interface DownloadOperation:NSOperation
//需要传入图片的URL
@property(nonatomic,strong) NSString *url;
//声明代理属性
@property(nonatomic,weak) id<DownloadOperationDelegate> delegate;
@end


#import"DownloadOperation.h"
@implementation DownloadOperation
-(void)main
{
    @autoreleasepool{
    //获取下载图片的URL
        NSURL *url=[NSURL URLWithString:self.url];
    //从网络下载图片
        NSData *data=[NSData dataWithContentsOfURL:url];
    //生成图像
        UIImage *image=[UIImage imageWithData:data];
    //在主操作队列通知调用方更新UI
        [[NSOperationQueue mainQueue] addOperationWithBlock:^{
            NSLog(@"图片下载完成……");
        if([self.delegate respondsToSelector:
            @selector(downloadOperation:image:)]){
            [self.delegate downloadOperation:self image:image];
        }
        }];
    }
}
@end
DownloadOperation.m文件中,main方法实现了下载操作的功能,并通过downloadOperation:image:方法将下载好的图片通过代理的方式传递给代理方。

在ViewController.m文件中,创建NSOperationQueue队列,设置ViewController成为DownloadOperation的代理对象,创建自定义操作,并将自定义操作对象添加到NSOperationQueue队列中,最后刷新界面,代码如下:

#import "ViewController.h"
#import "DownloadOperation.h"
@interface ViewController ()<DownloadOperationDelegate>
@property (weak, nonatomic) IBOutlet UIImageView *imageView;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //创建队列
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];
    //队列添加操作
    DownloadOperation *operation=[[DownloadOperation alloc] init];
    operation.delegate=self;
    operation.url=@"https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1284235532,3794754795&fm=27&gp=0.jpg";
    //将下载操作添加到操作队列中去
    [queue addOperation:operation];
}
-(void)downloadOperation:(DownloadOperation *)operation image:(UIImage *)image
{
    self.imageView.image=image;
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end
运行程序,结果如下图所示:


从图中可以看出,自定义的NSOperation的子类同样实现了图片的下载操作。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值