iOS多线程04-NSOperation实践

推荐文章

iOS多线程01-介绍

iOS多线程02-NSThread实践

iOS多线程03-GCD实践

iOS多线程04-NSOperation实践

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下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么? 1...
    AlanGe阅读 5,808评论 0 17
  • 多线程 在iOS开发中为提高程序的运行效率会将比较耗时的操作放在子线程中执行,iOS系统进程默认启动一个主线程,用...
    郭豪豪阅读 7,438评论 0 4
  • 欢迎大家指出文章中需要改正或者需要补充的地方,我会及时更新,非常感谢。 一. 多线程基础 1. 进程 进程是指在系...
    xx_cc阅读 12,006评论 11 70
  • 许久没有这般安静地,安静下来。灵感似海水般涌来。 上一次这种感觉的时候,大概是在高考之前了。 遥远的事。 冒着大雨...
    欹芸阅读 2,555评论 0 0
  • ❤ 有你 有你们
    Lavenderlynn阅读 1,265评论 0 0

友情链接更多精彩内容