iOS开发—使用NSOperation子类操作

因为NSOperation本身是抽象基类,表示一个独立的计算单元,因此如果要创建对象的话,必须使用它的子类。Foundation框架提供了两个具体子类直接供开发者使用,它们就是NSInvocationOperation和NSBlockOperation类。除此之外,还可以自定义子类,只要继承于NSOperation类,实现内部相应的方法即可。下面介绍这三种情况:

1、NSInvocationOperation

NSInvocationOperation类用于将特定对象的特定方法封装成NSOperation,基于一个对象和selector来创建操作。如果已经有现有的方法来执行需要的任务,就可以使用这个类。

接下来,创建一个SingleViewApplication工程,命名为09-NSInvocationOperation,具体代码如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //创建操作
    NSInvocationOperation *operation=[[NSInvocationOperation alloc]
                                      initWithTarget:self selector:@selector(download) object:nil];
    //创建队列
    NSOperationQueue *queue=[[NSOperationQueue alloc] init];
    //添加操作到队列中,会自动异步执行
    [queue addOperation:operation];
}
-(void)download
{
    NSLog(@"download-----%@",[NSThread currentThread]);
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
运行程序,结果如下:


从图中看出,

[queue addOperation:operation];

这行代码调用addOperation:方法让操作异步执行。若要使操作同步执行,则将这行代码改为调用start方法开启即可。

2、NSBlockOperation

NSBlockOperation类用于将代码块封装成NSOperation,并能够并发地执行一个或者多个block对象,所有相关的block代码块都执行完成后,操作才算完成。

接下来创建一个SingleViewApplication工程,命名为10-NSBlockOperation,具体代码如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSBlockOperation *operation=[[NSBlockOperation alloc] init];
    [operation addExecutionBlock:^{
        NSLog(@"---下载图片---1---%@",[NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"---下载图片---2---%@",[NSThread currentThread]);
    }];
    [operation addExecutionBlock:^{
        NSLog(@"---下载图片---3---%@",[NSThread currentThread]);
    }];
    [operation start];
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end
运行程序,结果如下图:


从图中看出,尽管operation对象是通过调用start方法来开启线程的,但是operation添加的3个block是并发执行的,也就是在不同线程中执行的。因此,当同一个操作中的任务量大于1时,该操作会实现异步执行。

3、自定义NSOperation子类

如果NSInvocationOperation和NSBlockOperation对象不能满足需求,开发者可以自定义操作来直接继承NSOperation,并添加任何想要的行为,这要取决于需要自定义的类是想要实现非并发还是并发的NSOperation。

定义非并发的NSOperation要简单许多,只需要重载main这个方法,在这个方法里面执行主任务,并正确地响应取消事件。对于并发NSOperation操作,必须重写NSOperation的多个基本方法进行实现。

猜你喜欢

转载自blog.csdn.net/shichunxue/article/details/78505621