GCD
1、创建GCD任务的方式有
1、dispatch_async(异步执行)
2、dispatch_sync (同步执行)
2、创建GCD任务时需要加入到队列中执行。GCD中的队列有
1、串行队列
2、并行队列
3、主队列 (GCD自带的一种特殊的串行队列)
。所有放在主队列中的任务,都会放到主线程中执行
。可使用dispatch_get_main_queue()获得主队列
3、创建GCD有6种不同的组合方式
1、同步执行 + 串行队列 (不会开启新线程,在当前线程执行任务。任务是串行的,执行完一个任务,再执行下一个任务。)
2、同步执行 + 并行队列 (特点:在当前线程中执行任务,不会开启新线程,执行完一个任务,再执行下一个任务。)
3、同步执行 + 主队列 (同步执行 + 主队列在不同线程中调用结果也是不一样,在主线程中调用会出现死锁,而在其他线程中则不会。在其他线程中,不会开启新线程,执行完一个任务,再执行下一个任务)
4、异步执行 + 串行队列 (会开启新线程,但是因为任务是串行的,执行完一个任务,再执行下一个任务)
5、异步执行 + 并行队列 ( 特点:可以开启多个线程,任务交替(同时)执行。)
6、异步执行 + 主队列 (只在主线程中执行任务,执行完一个任务,再执行下一个任务。)
异步执行一个串行队列的时候,开启一个新线程01,多次调用后,只在新线程01内执行。
异步一个并行队列,开启一个新的线程01,多次调用后,开启不同的新线程02,线程03.....。
同步执行一个串行队列时,没有开启新线程,如果在queue所在的线程上开启会造成死锁。
同步一个并行队列,没有开启新线程。
4、GCD的其他方法
4.1、dispatch_apply GCD 快速迭代方法
通常我们会用 for 循环遍历,但是 GCD 给我们提供了快速迭代的函数dispatch_apply。dispatch_apply按照指定的次数将指定的任务追加到指定的队列中,并等待全部队列执行结束。
dispatch_queue_t applyQueue = dispatch_queue_create("com.laxton.applyQueue", DISPATCH_QUEUE_CONCURRENT);
size_tcount =10;
//如果是串行队列循环执行全部在主线程上。如果在并发队列中开启新的线程循环执行。
dispatch_apply(count, applyQueue, ^(size_ti) {
NSLog(@"循环执行第%li次 %@",i,[NSThreadcurrentThread]);
});
4.2 GCD 栅栏方法:dispatch_barrier_async
在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作。
4.3 dispatch_group_wait
暂停当前线程(阻塞当前线程),等待指定的 group 中的任务执行完成后,才会往下继续执行。
4.4 dispatch_group_enter、dispatch_group_leave
从dispatch_group_enter、dispatch_group_leave相关代码运行结果中可以看出:当所有任务执行完成之后,才执行 dispatch_group_notify 中的任务。这里的dispatch_group_enter、dispatch_group_leave组合,其实等同于dispatch_group_async。
作者:行走的少年郎
链接:https://www.jianshu.com/p/2d57c72016c6
來源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
NSOperation
系统提供两种Operation
1、NSInvocationOperation 加入队列后开启新线程执行任务
NSInvocationOperation*invocationOperation = [[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(loadImageSource:)object:@"imageUrl"];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queueaddOperation:invocationOperation];
2、NSBlockOperation 加入队列后开启新线程执行任务
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
[self loadImageSource:@"www."];
}];
[queueaddOperation:blockOperation];
NSOperation 与 CGD相比
1、可以设置两个任务之间的依赖
2、可以设置一个任务在队列中的优先级
3、可以设置队列的最大并发数。(允许同时进行几个任务)
NSThread
优点:
1、(有几个属性BOOL executing,BOOL finished,BOOL cancelled)可以检查到线程的状态。
2、(有方法 - (void)cancel,- (void)start, + (void)exit;)来操作线程开始和取消跟退出。
3、轻量级,是真正的多线程。
4、(+ (BOOL)setThreadPriority:(double)p;)可以设置线程优先级。
缺点:
1、要自己手动管理线程生命周期,不支持多核。
CGD
优点:
支持多核,高效,使用简便不需要管理线程周期
缺点:
1、不能检测到线程状态。
2、不能设置线程优先级。
3、线程数不可控。
NSOperation
优点:
1、(有属性:BOOL cancelled,BOOL executing,BOOL finished)可以检测到任务的状态。
2、(有方法- (void)cancel,如果你的操作已经执行,它不会让你的任务立即停止,只是更新任务的内部标志,如果操作还没有执行,则取消队列里的操作,如果操作已经完成,则此方法没有任何效果)
3、(有方法- (void)addDependency:(NSOperation*)op;- (void)removeDependency:(NSOperation*)op;)添加依赖删除依赖。)
4、(有属性NSOperationQueuePriority queuePriority;)可以设置操作优先级
5、(可以添加到NSOperationQueue中实现并发执行,NSOperationQueue 属性maxConcurrentOperationCount可以设置可以同时执行的最大操作数)
缺点:
是抽象类,要创建子类才能使用。