在IOS中为什么使用多线程及多线程实现的三种方法

2020-01-14 17:32:01王振洲

NSOperationQueue对象比GCD中队列更加的强大和灵活,比如:设置并发操作数量,取消队列中所有操作。
NSOperation分为NSInvocationOperation和NSBlockOperation

NSInvocationOperation的使用


//首先定义一个NSOperationQueue对象
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction:) object:@"这里可以穿参数"];
[queue addOperation:op];//把操作加入队列中即开始执行
- (void)operationAction:(id)obj
{
 NSLog(@"%@ - obj : %@", [NSThread currentThread], obj);
}

输出为:

2015-11-23 02:55:19.067 多线程demo[2604:3686934] <NSThread: 0x7f9dfa443510>{number = 2, name = (null)} - obj : 这里可以穿参数

NSBlockOperation的使用


NSOperationQueue *queue = [[NSOperationQueue alloc] init];
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
 [self operationAction:@"这是NSBlockOperation"];
}];
[queue addOperation:op];

输出为:

2015-11-23 02:56:11.812 多线程demo[2617:3687872] <NSThread: 0x7fa983f10a50>{number = 2, name = (null)} - obj : 这是NSBlockOperation

设置依赖关系(执行顺序)


 NSOperationQueue *queue = [[NSOperationQueue alloc] init];
 NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction:) object:@"op1"];
 NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationAction:) object:@"op2"];
 //op2在op1之后执行
 [op2 addDependency:op1];//这里需要注意,一定要在addOperation之前设置依赖关系 
 [queue addOperation:op1];
 [queue addOperation:op2];

输出为:

2015-11-23 02:57:40.283 多线程demo[2661:3689737] <NSThread: 0x7fb663e132d0>{number = 2, name = (null)} - obj : op1
2015-11-23 02:57:40.284 多线程demo[2661:3689737] <NSThread: 0x7fb663e132d0>{number = 2, name = (null)} - obj : op2

没有设置依赖关系的输出:

2015-11-23 03:00:45.939 多线程demo[2709:3692307] <NSThread: 0x7fe951d0d8a0>{number = 2, name = (null)} - obj : op2
2015-11-23 03:00:45.939 多线程demo[2709:3692308] <NSThread: 0x7fe951c24720>{number = 3, name = (null)} - obj : op1

到这里你应该发现了,在NSOperation & NSOperationQueue中,我们不需要再像GCD那样定义操作的类型和队列的类型和控制操作的执行顺序了,你只需要直接设定操作的执行顺序就可以了。