这篇是我看了下面的文章然后做的知识点整理,附上文章地址:
关于iOS多线程,你看我就够了
多线程的技术种类
- Pthreads
- NSThread
- GCD
- NSOperation
Pthreads
基于C语言框架,一般不怎么用,用在类Unix操作系统中
NSThread
对Pthreads的封装,让其面向对象,相对来说更加方便,但需要程序员来对其生命周期进行管理,比较麻烦,一般不怎么用,用的多的是:
[NSThread CurrentThread]
GCD
苹果为多核运算提出的解决方案,其优点是自动会合理的使用CPU多核,并且线程的生命周期不需要程序员去管理。其有两个重要的概念:任务和队列。
任务
GCD中的block就是一个任务,任务的执行有分为两种:同步执行和异步执行
同步执行:
阻塞当前线程,等block中的任务完成后再解除阻塞。
异步执行:
不阻塞当前线程,直接执行接下来的任务。
队列
队列存放着任务,队列分两种:串行队列和并行队列
串行队列
GCD会一个一个地从串行队列中取出任务,当一个任务完成后,再去取另一个任务。
并行队列
GCD会从队列中取出任务,不等一个任务完成就会去取其他任务,把其他任务放到其他线程中。
创建队列
默认的主队列
dispatch_queue_t mainQueue = dispatch_get_main_queue();获取全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
其中,第一个参数为优先级,第二个参数为保留字段,填0即可。自定义队列
//自定义串行队列
dispatch_queue_t custom1Queue = dispatch_queue_create("custom1", DISPATCH_QUEUE_SERIAL);
//自定义并发队列
dispatch_queue_t custom2Queue = dispatch_queue_create("custom2", DISPATCH_QUEUE_CONCURRENT);
队列组
可以把所有的队列加进一个队列组中,当队列组中所有的任务都完成时,队列组会发送一个消息。
- 创建队列组
dispatch_group_t group = dispatch_group_create(); - 通知
dispatch_group_notify(group, queue, ^{
NSLog(@"完成-%@",[NSThread currentThread]);
});
NSOperation与NSOperationQueue
苹果对GCD进行的封装,NSOperation表示任务,NSOperationQueue表示队列。
NSOperation
NSOperation是一个抽象类,有NSBlockOperation及NSInvocationOperation两种子类,用的多的是NSBlockOperation。
NSBlockOperation
- 创建任务
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
这个任务是放在当前线程中执行的。执行任务要加start方法开始执行任务。 - 添加任务
NSBlockOperation有一个addExecutionBlock方法,可以在方法后面再增加方法
[operation1 addExecutionBlock:^{
for (int i = 0; i < 3; i++) {
NSLog(@"1第%d次:%@",i,[NSThread currentThread]);
}
}];
后增加的任务是在其他线程中执行。
这里有个弊端了,会在当前线程和其他线程中执行任务,那我怎么样让它只在其他线程中执行任务呢?
NSOperationQueue
如果想让任务只在其他线程中执行,用这个。
Queue分两种,一种是主队列,一种是其他队列。
主队列
NSOperationQueue *queue = [NSOperationQueue mainQueue];其他队列
NSOperationQueue *otherQueue = [[NSOperationQueue alloc]init];
其他队列的任务会在其他线程中执行。任务执行起来是并行执行。那如果想让多个任务串行执行要怎么办呢?用maxConcurrentOperationCount来指定并发数量,如果数量为1,那么就是说过个任务串行执行。-
添加依赖
如果想任务A先执行,执行完A后再任务B,执行完B后再执行任务C,如果想达到这个目的,可以使用依赖。
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载图片-%@",[NSThread currentThread]);
[NSThread sleepForTimeInterval:3.0];
}];NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"加水印%@",[NSThread currentThread]); [NSThread sleepForTimeInterval:5.0]; }]; NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{ NSLog(@"上传图片:%@",[NSThread currentThread]); }]; [operation2 addDependency:operation1]; [operation3 addDependency:operation2]; NSOperationQueue *queue = [[NSOperationQueue alloc]init]; [queue addOperations:@[operation1,operation2,operation3] waitUntilFinished:NO];