NSOperation和NSOperationQueue的使用
一、线程的创建
两种创建方式
1.使用系统提供的两种创建方式
NSInvocationOperation 和 NSBlockOperation,如果都是作为一个同步线程则基本没有区别
NSInvocationOperation :正常设置关联方法 start开始执行
NSBlockOperation :通过block块来执行,支持 addExecutionBlock 方法,通过该方法添加进去的事件均为异步执行
具体实现如下
NSInvocationOperation 的使用
NSDictionary *dic = [NSDictionary dictionaryWithObject:@"111" forKey:@"name"];
NSInvocationOperation *invocation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(showDic:) object:dic];
[invocation start];//这样启动是主线程启动
//放到序列自动执行 并且是用的子线程执行的
//NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//[queue addOperation:invocation];
NSBlockOperation 的使用
NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{
sleep(10); // 加个睡眠模仿耗时操作
NSLog(@"currentThread = %@", [NSThread currentThread]);
NSLog(@"mainThread = %@", [NSThread mainThread]);
}];
[block addExecutionBlock:^{
sleep(10); // 加个睡眠模仿耗时操作
NSLog(@"二次currentThread = %@", [NSThread currentThread]);
NSLog(@"二次mainThread = %@", [NSThread mainThread]);
}];
[block start];//通过addExecutionBlock添加的都将是异步子线程执行,同样可以放到队列中 自动执行并且是子线程
队列依赖使用方法 自由结合比较方便
//1.任务一:下载图片 NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"下载图片 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];
//2.任务二:打水印 NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"打水印 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];
//3.任务三:上传图片 NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"上传图片 - %@", [NSThread currentThread]); [NSThread sleepForTimeInterval:1.0]; }];
//4.设置依赖 [operation2 addDependency:operation1]; //任务二依赖任务一 [operation3 addDependency:operation2]; //任务三依赖任务二
//5.创建队列并加入任务 NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperations:@[operation3, operation2, operation1] waitUntilFinished:NO];
2.实现继承NSOperation类、NSOperationQueue队列
自定义NSOperation方法并且手动去管理是非常复杂的操作,需要实现start
、main
、isExecuting
、isFinished
、isAsynchronous等方法,并且要手动控制线程的释放、销毁等等操作。
iOS提供了一个好的
NSOperationQueue队列来帮助我们实现
//添加队列的方式 三种方式非常好用
// 直接添加一个 NSOperation 操作,并且加入并发队列,只要当前队列允许,就会立刻执行。
//[opQueue addOperation:]
// 添加一组操作,如果 waitUntilFinished 为 NO,则必须在当前队列中的所有操作都执行完了,才会执行这组操作,否则立刻执行。
//[opQueue addOperations: waitUntilFinished:YES]
// 直接在这里写一个block,block中的操作加入并发队列,并且只要当前队列允许执行,就会立刻执行。
//[opQueue addOperationWithBlock:^{
//}];
二、 一些队列常用的属性
//总线程对象数组
opQueue.operations
//总线程树龄
operationCount
//设置最大数 add超过这个数 后续的将等待执行
maxConcurrentOperationCount
//取消所有
cancelAllOperations
//等待所有执行完成 可以做一些必须完成才执行的动作
waitUntilAllOperationsAreFinished
三、控制并发量,线程队列设置最大并行数
[queue setMaxConcurrentOperationCount:5];
现实中真的用这个的话 系统提供的两种基本满足需要了。更多还是GCD主流