本篇文章主要介绍下多线程下NSBlockOperation和NSInvocationOperation的区别,列举个栗子给大家说明一下。
NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"BlockOperation 1 begin");
sleep(2); // 加个睡眠模仿耗时操作
NSLog(@"BlockOperation 1 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 1 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 1 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 2 begin");
sleep(2);
NSLog(@"BlockOperation 2 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 2 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 2 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 3 begin");
sleep(2);
NSLog(@"BlockOperation 3 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 3 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 3 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 4 begin");
sleep(2);
NSLog(@"BlockOperation 4 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 4 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 4 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 5 begin");
sleep(2);
NSLog(@"BlockOperation 5 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 5 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 5 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 6 begin");
sleep(2);
NSLog(@"BlockOperation 6 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 6 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 6 end");
}];
[op addExecutionBlock:^{
NSLog(@"BlockOperation 7 begin");
sleep(2);
NSLog(@"BlockOperation 7 currentThread = %@", [NSThread currentThread]);
NSLog(@"BlockOperation 7 mainThread = %@", [NSThread mainThread]);
NSLog(@"BlockOperation 7 end");
}];
NSLog(@"start");
[op start];
NSLog(@"end");
执行结果:
从执行结果可以看出, NSBlockOperation是优先使用主线程,主线程在忙的情况下再使用子线程。
2.接下来介绍NSInvocationOperation
NSOperationQueue *operationQueue = [[NSOperationQueue alloc] init]; //初始化操作队列
[operationQueue setMaxConcurrentOperationCount:3]; //同时容许几个线程在执行
// 可以传递一个 NSObject 给operation的操作方法
NSDictionary *dict = [NSDictionary dictionaryWithObject:@"value1" forKey:@"key"];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
NSInvocationOperation *op3 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
NSInvocationOperation *op4 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(operationSelector:) object:dict];
[operationQueue addOperation:op];
[operationQueue addOperation:op1];
[operationQueue addOperation:op2];
[operationQueue addOperation:op3];
[operationQueue addOperation:op4];
// NSInvocationOperation 操作执行的方法
- (void)operationSelector:(NSDictionary *)dict
{
// 接收传进来的dict
NSLog(@"dictValue = %@", [dict valueForKey:@"key"]);
sleep(2); // 加个睡眠模仿耗时操作
NSLog(@"currentThread = %@", [NSThread currentThread]);
NSLog(@"mainThread = %@", [NSThread mainThread]);
}
执行结果:
从执行结果可以看出, NSInvocationOperation都是异步在子线程中执行。
总结:NSBlockOperation是优先使用主线程,NSInvocationOperation在子线程中执行。俩者都是异步执行的。