iOS之家

iOS多线程-NSOperation实践

2017-07-01  本文已影响24人  小小土豆dev

推荐文章

iOS多线程-NSThread实践

iOS多线程-GCD实践


NSOperation只是一个抽象类,所以不能封装任务。使用NSOperation的方式有2种:

1> Foundation框架提供了两个NSOperation的子类直接供我们使用:NSInvocationOperation和NSBlockOperation。

2> 自定义子类继承NSOperation,实现内部相应的方法。

创建一个Operation后,需要调用start方法来启动任务。NSOperation对象默认按同步方式执行,也就是在调用start方法的那个线程中直接执行。NSOperation对象的isConcurrent方法会告诉我们这个操作相对于调用start方法的线程,是同步还是异步执行。isConcurrent方法默认返回NO,表示操作与调用线程同步执行

NSInvocationOperation

1、创建NSInvocationOperation对象

#define kURL @"http://avatar.csdn.net/2/C/D/1_totogo2010.jpg"

NSInvocationOperation* operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImage:) object:kURL];

-(void)downloadImage:(NSString*)url

{

NSURL* nsUrl = [NSURL URLWithString:url];

NSData* data = [[NSData alloc] initWithContentsOfURL:nsUrl];

UIImage* image = [[UIImage alloc] initWithData:data];

//线程下载完图片后通知主线程更新界面

[self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];

}

-(void)updateUI:(UIImage*)image

{

self.imageView.image = image;

}

2、开始执行

[operation start];

operation开始执行之后,默认会一直执行操作直到完成,我们也可以调用cancel方法中途取消操作

[operation cancel];

3、把NSInvocationOperation放到NSOperationQueue队列中

NSOperationQueue*queue = [[NSOperationQueue alloc] init];

[queue addOperation:operation];

注意:

如果你创建了一个NSInvocationOperation任务,把它加入NSOperationQueue队列中,此时不需要调用start方法,它会自动开启异步执行。一个NSInvocationOperation对象就是一个线程。

控制线程池中的线程数(线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作)

[queue setMaxConcurrentOperationCount:5];

4、监听操作的执行:如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情

operation.completionBlock= ^() {

NSLog(@"执行完毕");

};

//或者

[operationsetCompletionBlock:^() {

NSLog(@"执行完毕");

}];

NSBlockOperation

1、创建NSBlockOperation对象

NSBlockOperation* operation = [NSBlockOperation blockOperationWithBlock:^(){

NSLog(@"执行第1次操作,线程:%@", [NSThread currentThread]);

}];

addExecutionBlock:,通过这个方法可以给Operation添加多个执行Block

[operation addExecutionBlock:^() {

NSLog(@"又执行了1个新的操作,线程:%@", [NSThreadcurrentThread]);

}];

2、开始任务

[operation start];

自定义NSOperation

如果NSInvocationOperation和NSBlockOperation对象不能满足需求, 你可以直接继承NSOperation, 并添加任何你想要的行为。

Demo下载地址

上一篇下一篇

猜你喜欢

热点阅读