详解IOS中GCD的使用
grand central dispatch(gcd)是异步执行任务的技术之一。一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的dispatch queue中,gcd就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
1. gcd是苹果公司为多核的并行运算提出的解决方案
gcd会自动利用更多的cpu内核(比如双核、四核)
gcd会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
程序员只需要告诉gcd想要执行什么任务,不需要编写任何线程管理代码
进程:也就是一个正在运行的应用程序。
线程:进程中的某一条完整的执行路径。一个进程可以有多个线程,至少有一个线程,即主线程。在ios开发中,所有涉及ui界面的,必须在主线程中更新。
2. gcd的工作原理:让程序平行排队,根据可用的处理资源,安排他们在任何可用的处理器上执行任务
3. 串行队列,并行队列,同步任务,异步任务。 异步任务会开辟线程:异步任务在串行队列只开启一个子线程,异步任务在并行队列开启多个子线程。
//gcd 并行队列,异步任务:开启多个线程,同时执行。 dispatch_queue_t queue = dispatch_get_global_queue(dispatch_queue_priority_default, 0); dispatch_async(queue, ^{ for (int i =0; i<1000; i++) { nslog(@"aaaaa %d",i); } }); dispatch_async(queue, ^{ for (int i =0; i<1000; i++) { nslog(@"bbbbb %d",i); } }); dispatch_async(queue, ^{ for (int i =0; i<1000; i++) { nslog(@"ccccc %d",i); } }); //串行队列,同步任务 :不开启线程,按顺序执行 dispatch_queue_t cqueue = dispatch_queue_create("queuename", null); dispatch_sync(cqueue, ^{ for (int i =0; i<1000; i++) { nslog(@"ddddd %d",i); } }); dispatch_sync(cqueue, ^{ for (int i =0; i<1000; i++) { nslog(@"eeeee %d",i); } }); dispatch_sync(cqueue, ^{ for (int i =0; i<1000; i++) { nslog(@"fffff %d",i); } });
4.我们平时使用多线程,会经常碰到一种需求:子线程任务处理完成之后,需要主线程更新ui。我们如何才能知道子线程的任务都完成了。
当我们使用串行队列时,只需将最后的回调主线程任务添加在所有任务的最后,顺序执行,便可回调。 但是当我们使用并行队列时候,就无法知道什么时候完成所有的子线程任务,
这时候,就得用到dispatch_group了。代码如下:
//我们同时执行几个异步任务,他们执行完了,我们有时候还得知道一下,,怎么办呢,这时候,就得用到dispatch_group了,如下编代码这样弄,到最后执行 dispatch_group_notify ,便可 dispatch_queue_t queue = dispatch_get_global_queue(dispatch_queue_priority_default, 0); dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, queue, ^{ nslog(@"开始执行1"); }); dispatch_group_async(group, queue, ^{ nslog(@"开始执行2"); }); dispatch_group_async(group, queue, ^{ nslog(@"开始执行3"); }); dispatch_group_notify(group, queue, ^{ nslog(@"全部执行完成,必须在主线程更新ui!!!"); dispatch_async(dispatch_get_main_queue(), ^{ nslog(@"主线程更新ui完成。"); }); });
以上内容是小编给大家介绍的ios中gcd的使用,希望对大家有所帮助!
上一篇: 心烦吃什么好,好吃的可以让心情美起来哦!
下一篇: 白菜豆腐汤的做法你会了吗?