版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.16 |
前言
信号量机制是多线程通信中的比较重要的一部分,对于
NSOperation
可以设置并发数,但是对于GCD
就不能设置并发数了,那么就只能靠信号量机制了。接下来这几篇就会详细的说一下并发机制。感兴趣的可以看这几篇文章。
1. iOS与多线程(一) —— GCD中的信号量及几个重要函数
2. iOS与多线程(二) —— NSOperation实现多并发之创建任务
队列的创建
上一篇主要讲了NSOperation API
接口以及创建任务的方法,下面就说一下队列的创建方法。NSOperationQueue
可以分为两种队列,主队列和其他队列,其他队列里面还可以实现串行和并发功能。
- 主队列:添加到主队列中的任务都会放在主线程中执行。
NSOperationQueue *queue = [NSOperationQueue mainQueue];
- 其他队列:添加到其他队列中的任务都会放在子线程中执行。
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
添加任务到队列
下面我们就看一下添加任务到队列。
方法1
可以使用方法- (void)addOperation:(NSOperation *)op;
下面还是看代码。
#import "JJOperationQueueVC.h"
@interface JJOperationQueueVC ()
@end
@implementation JJOperationQueueVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
//创建任务,你也可以使用NSInvocationOperation,我这里就只用NSBlockOperation做个例子了
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOperation");
NSLog(@"thread = %@",[NSThread currentThread]);
}];
[queue addOperation:blockOperation];
}
@end
看输出结果
2017-08-16 17:36:13.590386+0800 JJOC[10142:4509963] blockOperation
2017-08-16 17:36:13.590538+0800 JJOC[10142:4509963] thread = <NSThread: 0x17407ff40>{number = 4, name = (null)}
可以发现开启了新的线程,同时将任务放在队列里面,任务就会立即执行,不同调用其他方法才开始执行。
方法2
使用- (void)addOperationWithBlock:(void (^)(void))block NS_AVAILABLE(10_6, 4_0);
还是直接看代码。
#import "JJOperationQueueVC.h"
@interface JJOperationQueueVC ()
@end
@implementation JJOperationQueueVC
#pragma mark - Override Base Function
- (void)viewDidLoad
{
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
//创建队列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperationWithBlock:^{
NSLog(@"blockOperation");
NSLog(@"thread = %@",[NSThread currentThread]);
}];
}
@end
下面看输出结果
2017-08-16 17:38:32.428260+0800 JJOC[10146:4510462] blockOperation
2017-08-16 17:38:32.428661+0800 JJOC[10146:4510462] thread = <NSThread: 0x170075a00>{number = 4, name = (null)}
可见也开启了一个新的线程。
后记
未完,待续~~~