码迷,mamicode.com
首页 > 移动开发 > 详细

IOS多线程--NSOperation\NSOperationQueue

时间:2015-11-26 09:29:56      阅读:300      评论:0      收藏:0      [点我收藏+]

标签:

iOS中,有多种多线程方式,但是,苹果公司建议我们用NSOperation技术

    1.GCD是纯C的,对面向对象的程序员不友好

    2.GCD对编程管理还不是很强大

 

    NSOperation 其实底层实现是基于GCD来做的

    dispatch_queue_t ==  NSOperationQueue

    dispatch_async == NSOperation

    dispatch_sync  == NSOperation

 

    NSOperation是个抽象类

    使用它的两个子类

    NSInvocationOperation

    NSBlockOperation

默认是在主线程上执行,会阻塞主线程

1.申请一个任务(self 响应的eat方法)

NSInvocationOperation *iop = [[NSInvocationOperation alloc]initWithTarget

  执行任务 [iop start];

 

2.block任务,直接使用,默认也是主线程

(1)addExecutionBlock能够实现并发执行,有新线程产生

     NSBlockOperation *bop = [NSBlockOperation blockOperationWithBlock:^{

¥如果创建时没有执行任务、用addExecutionBlock添加的第一个任务也是主线程执行的、第二个才是新线程、

(2)添加执行block

[bop addExecutionBlock:^{

(3)完成任务给个回调、回调后面的便不再执行、不往下走了

bop.completionBlock = ^{

但是、start还是执行的、start必须存在、不然整个NSBlockOperation都不执行

这些任务都是在start之前执行的

 

    执行任务[bop start];

 

NSOperationQueue管理任务

1、一旦把任务交给队列管理、任务就是并发的

2、任务都是在子线程中完成的

3、不需要调用start方法、自动就会执行

 

(1)创建 alloc init

(2)在同一时刻并发执行的最大数量,这一点就完胜GCD,需要在添加任务之前设定 

queue.maxConcurrentOperationCount = 2;

(3)把任务交给队列管理

[queue addOperation:iop1];

    [queue addOperation:iop2];

或者

参数:waitUntilFinished是否等待队列任务都完成后 再往后执行

    [queue addOperations:@[iop2,iop1] waitUntilFinished:NO];

 

控制NSOperationQueue顺序

可一个给任务添加依赖关系、相当于间接的设定了任务的顺序(串行)

(1)依赖关系必须添加到任务提交之前

[iop1 addDependency:iop2];(iop1依赖于iop2,那么2先,1后)

(2)挂起主线程,等待所有的任务都完成,主线程才能继续执行,只要有没完成的,方法就不返回

[queue waitUntilAllOperationsAreFinished];

¥waitUntilFinished:NO  和   waitUntilAllOperationsAreFinished

都是控制主线程也就是NSOperationQueue之外的任务是否立即执行还是等待队列中任务完成后执行

(3)暂停

[self.queue setSuspended:YES];

1.正在执行的任务不会受暂停影响

    2.只有还没执行的任务才能被操控

    3.NSOperationQueue默认是并发的,需要设置依赖关系才能出现没执行的任务,才能做暂停操控

(4)继续

[self.queue setSuspended:NO];

(5)只能取消未执行的任务,取消后不能继续

[self.queue cancelAllOperations];

 

IOS多线程--NSOperation\NSOperationQueue

标签:

原文地址:http://www.cnblogs.com/gaduo/p/4996561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!