iOS - 多线程-NSOperation

NSOperation是NSTheard之外的另一种多线程方法

采用NSOperation(线程操作,通常用他的子类)和NSOperationQueue(线程队列)搭配来做多线程开发,采用NSOperation指定一个操作,把这个操作放到线程队列(线程池)中,让线程队列安排他的生命周期。

1.NSInvocationOperation与NSOperationQueue搭配使用

2.NSBlockOperation与NSOperationQueue搭配使用,方式一和方式二没有什么本质区别,主要是后者使用block形式进行代码组织,使用相对方便

3.继承于NSOperation的子类与NSOperationQueue搭配使用,更方便封装某一个线程操作。

1.该子类需重写main方法,在main方法内做线程操作,该线程被执行就会自动调用main方法

2.在main方法内切记要新建一个自动释放池,因为如果是同步操作,该方法能够自动访问到主线程的自动释放池,如果是异步执行操作,那么将无法访问到主线程的自动释放池。

3、与NSThread有什么区别

1、NSThread需要启动,也就是说需要费心管理线程的生命周期,而采用NSOperation方式只需要将线程放到线程队列中即可,线程队列负责管理、执行所有的线程操作

2、管理线程的最大并发数,也就是同时执行的任务数

3、控制线程之间的依赖关系,NSOperation之间可以设置依赖来保证执行顺序。比如一定要让操作1执行完这后,才能执行操作2,线程之间不能相互依赖,不能A依赖B、B又依赖A

4、队列的取消、暂停、恢复


#pragma makr ==NSInvocationOperation和NSOperationQueue搭配运行多线程开发===

1、创建视图

2、创建线程

3、创建线程队列

4、把线程放在线程队列中

5、在子线程加载网络资源

// 1、创建视图

imageView = [[UIImageView

alloc]initWithFrame:CGRectMake(50,50,200,200)];

[self.viewaddSubview:imageView];

//  2、创建线程

NSInvocationOperation* invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(loadResource)object:nil];

//3、创建线程队列

NSOperationQueue*operationQueue = [NSOperationQueuenew];//new类似alloc init

// 4、把线程放在线程队列中

[operationQueueaddOperation:invocationOperation];

}

//   5、在子线程加载网络资源

-(void)loadResource{

NSData*data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:kurl]];

UIImage*image = [UIImageimageWithData:data];

//6、回到主线程

[[NSOperationQueuemainQueue]addOperationWithBlock:^{

//7、更新UI

imageView.image= image;

}];


#pragma mark---2. NSBlockOperation与NSOperationQueue搭配使用

//1、创建视图

imageView= [[UIImageViewalloc]initWithFrame:CGRectMake(50,50,200,200)];

[self.viewaddSubview:imageView];

//2、创建一个线程操作

NSBlockOperation*blockOperation = [NSBlockOperationblockOperationWithBlock:^{

//5、加载网络资源

NSData*data = [NSDatadataWithContentsOfURL:[NSURLURLWithString:kurl]];

UIImage*image = [UIImageimageWithData:data];

//6、回到主线程

[[NSOperationQueuemainQueue]addOperationWithBlock:^{

//7、更新UI

imageView.image= image;

}];

}];

//3、创建线程队列

NSOperationQueue*operationQueue = [NSOperationQueuenew];

//4、把线程操作放到线程队列里面

[operationQueueaddOperation:blockOperation];

#pragma mark用自定义与NSOperation的类与NSOperationQueue搭配

// 1、创建视图

imageView= [[UIImageViewalloc]initWithFrame:CGRectMake(50,50,200,200)];

[self.viewaddSubview:imageView];

//2、创建一个线程操作在类中重写main,在main指定要进行的操作

CustomOperation*customOperation = [[CustomOperationalloc]initWithImageView:imageView];

//3、创建一个线程队列

NSOperationQueue*operationQueue = [NSOperationQueuenew];

//4、将线程操作放到线程队列中

[operationQueueaddOperation:customOperation];

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

相关阅读更多精彩内容

  • 和GCD的对比 操作队列,比GCD更早,GCD在设计上很多都是基于操作队列的原理构建的。在iOS4之后,操作队列的...
    doudo阅读 1,535评论 0 0
  • 1. NSOperation简介 在某些情况下,执行后台任务GCD不一定是最好的方式,还有一种技术叫做操作队列NS...
    Claire_wu阅读 4,668评论 0 0
  • NSOperation是苹果提供给我们的一套多线程解决方案。实际上它是在ios4后基于GCD开发的,但是比GCD拥...
    艳晓阅读 1,607评论 0 2
  • 一、简介 NSOperation 的作用NSOperation 是对 GCD 的一层封装,更加面向对象。 配合使用...
    hrscy阅读 3,173评论 0 3
  • 近日,买到了贺学宁的新书《南国花影》,没想到,竟对它爱不释手。每天无论有多累,都要看上几十页,才能安然入睡。 我很...
    诗悠912阅读 2,726评论 0 0

友情链接更多精彩内容