-NSOperation是个抽象类,并不具备封装任务的能力,必须使用他的子类
1.NSInvocationOperation
2.NSBlockOperation
3.自定义类继承NSOperation 实现内部方法
NSOperation的队列
1.主队列:
NSOperationQueue *queue = [NSOperationQueue mainQueue];
2.非主队列( 同事具备并发和串行队列的功能 默认是并发队列)
NSOperationQueue *queue = [NSOperationQueue alloc] init];
创建操作的第一种方法NSInvocationOperation
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil];
添加操作到队列中
[queue addoperation:op];
创建操作的第二种方法
NSBlockOperation
创建操作
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock^{ 要执行的任务 }];
追加任务
[block addExecutionBlock:^{ 要执行的任务 }];
创建队列
NSOperationQueue *queue = [NSOperationQueue alloc] init];
添加操作到队列中
[queue addOperation :block];
**************************************
简便方法
内不执行:创建操作 把操作添加到队列中
[queue addOperationWithBlock:^{ 要执行的任务 }];
创建操作的第三种方法
自定义类继承NSOperation
自定义的类MJROperation
封装操作
修改.m文件 (- main)方法在此函数中封装任务
MJROperation *op = [MJROperation alloc] init];
#非主队列改为串行队列
修改最大并发数maxConcurrentOperationCount
1.同一时间有多少个任务可执行
2.串行执行任务 != 只开一条线程(线程同步)
1 并发 <1 串行
设置最大并发数
maxConcurrentOperationCount = 1;
暂停
[queue setSuspended : YES];
取消队列中所有的操作
[queue cancelAllOperations];
添加操作依赖
1.控制任务执行的顺序
2。不能循环依赖 (若循环则不奔溃, 只是不执行该操作)
3.可以跨队列依赖
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{ 执行的任务 }];
NSBlockOperation *block1 = [NSBlockOperation blockOperationWithBlock:^{ 执行的任务 }];
添加依赖
[block addDependency:block1];
添加监听
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{ 执行的任务 }];
添加监听
block.completionBlock = ^{ block执行完后 所要执行的任务 };