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];