Grand Central Dispatch(GCD)是Apple开发的一个多核编程的解决方法,宏大的中央调度,串行队列、并发队列、主线程队列,必须回到主线程刷新UI
- 优点:最高效,避开并发陷阱。
- 缺点:基于C实现。
1.串行队列
获取mainQueue,mainQueue会在主线程中执行,即:主线程中执行队列中的各个任务
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
});
自己创建serial queue。自己创建的serial queue 不会在主线程中执行,queue会开辟一个子线程,在子线程中执行队列中的各个任务。
dispatch_queue_t mySerialQueue = dispatch_queue_create("com.boweifeng.GCD.mySerialQueue", DISPATCH_QUEUE_SERIAL);
dispatch_async(mySerialQueue, ^{
NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
});
2.并发队列
获得concurrent queue的方式有两种
1、获得global queue
global queue会根据需要开辟若干个线程,并行执行队列中的任务。开始较早的任务并不一定最早结束,开辟的线程数量取决于多方面的因素。比如:任务的数量,系统的内容资源。但是TA会以最优的方式开辟线程----根据需求自动开辟
dispatch_queue_t globalQueue = dispatch_get_global_queue(QOS_CLASS_USER_INTERACTIVE, 0);
dispatch_async(globalQueue, ^{
NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
});
2.自己创建一个concurrent queue
dispatch_queue_t myConcurrentQueue = dispatch_queue_create("com.bwf.GCD.myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myConcurrentQueue, ^{
NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
});
3.dispatch_after
函数作用是延时执行某个任务,任务既可以在mainQueue中执行,也可以在其他queue中执行。既可以在serial队列中执行,也可以在concurrent队列中执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"我觉得五秒就挺好!");
});
4.组线程
创建一个组线程 在组线程里可以执行多个线程
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t myConcurrntQueue = dispatch_queue_create("com.lanou.GCD.cct", DISPATCH_QUEUE_CONCURRENT);
//把创建出来的线程放到主线程中执行
dispatch_group_async(group, myConcurrntQueue, ^{
NSLog(@"第一个任务,所在线程%@,是否是主线程:%d",[NSThread currentThread],[NSThread isMainThread]);
});
//在组线程里执行完所有了任务后 再执行此任务
dispatch_group_notify(group, myConcurrntQueue, ^{
NSLog(@"group中的任务都执行完毕之后,执行此任务,所在线程为%@,是否为主线程%d",[NSThread currentThread],[NSThread isMainThread]);
});
5.once
用于定义那些只需要执行一次的代码,比如单例的创建
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"只执行一次!");
//这个Block里的代码,在程序执行过程中,只会执行一次。
//比如在这里写单例的初始化
static YourClass *instance = nil;
instance = [[YourClass alloc] init];
});
网友评论