1、使用NSInvocationOperation创建执行操作
在当前主线程执行,没有开辟新线程
#pragma mark - 使用NSInvocationOperation
-(void)useInvocation{
NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
[op start];
}
-(void)op1Action{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1 ------ %@",[NSThread currentThread]);
}
}
2、使用NSBlockOperation创建执行操作
在当前主线程执行,没有开辟新线程
#pragma mark - 使用NSBlockOperation
-(void)useBlock{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2 ------ %@",[NSThread currentThread]);
}
}];
[op start];
}
3、使用addExecutionBlock方法添加更多的执行操作
是否开启新的线程取决于添加执行操作的个数
#pragma mark - 使用useBlockOperationAddExecution
-(void)useBlockOperationAddExecution{
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3 ------ %@",[NSThread currentThread]);
}
}];
[op addExecutionBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"4 ------ %@",[NSThread currentThread]);
}
}];
[op start];
}
4、自定义一个Operation
创建一个继承自Operation的类,重写main方法,调用的时候因为这个类的头文件
.h
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@interface CustomOperation : NSOperation
@end
NS_ASSUME_NONNULL_END
.m
#import "CustomOperation.h"
@implementation CustomOperation
-(void)main{
if (!self.isCancelled) {
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"5 ------ %@",[NSThread currentThread]);
}
}
}
@end
引入头文件#import "CustomOperation.h",调用!
#pragma mark - 使用自定义NSOperation
-(void)useCustomOpeartion{
CustomOperation *cop = [CustomOperation new];
[cop start];
}
5、使用队列之-NSOperationQueue,创建主队列
不用说都知道,主队列是在当前主线程执行,并且是串行的
#pragma mark - 使用队列之-NSOperationQueue,创建主队列
-(void)createMainQueue{
//创建主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];
//创建线程
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3 ------ %@",[NSThread currentThread]);
}
}];
//添加线程到队列
[queue addOperation:op1];//相当于[op star];
[queue addOperation:op2];
[queue addOperation:op3];
}
6、使用队列之-NSOperationQueue,创建子队列
这里也是,既然是子队列,肯定是在子线程执行的,而且是并发的
这里有一点说明,把线程添加到队列有两种方式:1、addOperation;2、blockOperationWithBlock
创建子队列这里两种方式我都写出来了
#pragma mark - 使用队列之-NSOperationQueue,创建子队列
-(void)createSubQueue{
//子队列
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// //创建线程
// NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
// NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
//
// NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
// for (int i = 0; i < 2; i ++) {
// [NSThread sleepForTimeInterval:2];
// NSLog(@"3 ------ %@",[NSThread currentThread]);
// }
// }];
//
// //添加线程到队列
// [queue addOperation:op1];//相当于[op star];
// [queue addOperation:op2];
// [queue addOperation:op3];
#pragma arguments --------------------
[queue addOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"1 ------ %@",[NSThread currentThread]);
}
}];
[queue addOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"2 ------ %@",[NSThread currentThread]);
}
}];
[queue addOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3 ------ %@",[NSThread currentThread]);
}
}];
}
7、使用队列之-NSOperationQueue,控制串行和并发
在NSOperationQueue下,有个属性,叫做maxConcurrentOperationCount,我们可以用这个属性来控制串行或者并发,怎么控制呢?取决于maxConcurrentOperationCount的值,这个属性是一个基本数据类型的,所以,
它等于1的时候就是串行,大于1的时候就是并发
#pragma mark - 使用队列之-NSOperationQueue,控制串行和并发
-(void)useOperationCount{
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
// queue.maxConcurrentOperationCount = 1;//串行
queue.maxConcurrentOperationCount = 2;//并发
//创建线程
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
for (int i = 0; i < 2; i ++) {
[NSThread sleepForTimeInterval:2];
NSLog(@"3 ------ %@",[NSThread currentThread]);
}
}];
//添加线程到队列
[queue addOperation:op1];//相当于[op star];
[queue addOperation:op2];
[queue addOperation:op3];
}
8、通信
怎么理解呢?就是平时的那种处理数据,然后刷新UI。平时不都是在子线程处理数据啥的,完事之后回到主线程更新UI吗?我说的就是这个意思,这里我为了方便,写了一个GCD用来个NSOperation对比
#pragma mark - 模拟网络请求,刷新UI
-(void)requestDataAndRefreshUI{
#pragma arguments - NSOperation
// //异步子线程请求数据
// NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//
// [queue addOperationWithBlock:^{
//
// for (int i = 0; i < 10; i ++) {
//
// NSLog(@"iiii = %d",i);
// sleep(1);
//
// if (i == 5) {
//
// NSOperationQueue *queMian = [NSOperationQueue mainQueue];
//
// [queMian addOperationWithBlock:^{
// NSLog(@"刷新UI");
// }];
//
// }
//
// }
//
// }];
#pragma arguments - GCD
// dispatch_async(dispatch_get_global_queue(0, 0), ^{
//
// for (int i = 0; i < 10; i ++) {
//
// NSLog(@"iiii = %d",i);
// sleep(1);
//
// if (i == 5) {
//
// dispatch_async(dispatch_get_main_queue(), ^{
// NSLog(@"刷新UI");
// });
//
// }
//
// }
//
// });
}
9 、全剧终
有错误的地方欢迎指出,拜谢!
网友评论