iOS开发系列-GCD
概述
GCD是苹果公司为多核的并行运算提出的解决方案。全称是Grand Central Dospatch。纯C语言,提供了非常多强大的函数。
GCD自动管理线程的声明周期(创建线程、调度任务、销毁线程)。面向开发者只需要告诉GCD执行的任务。
GCD的核心概念
- 任务-执行的操作
- 队列-存放任务
GCD将任务添加进队列中,GCD会自动将队列中的任务取出放到对应的线程执行。任务的取出遵循队列的FIFO原则。
GCD基本使用
在使用GCD首先得创建队列。队列是用来添加任务的。GCD队列主要分两种类型:串行队列
和并发队列
。队列类型决定队列中任务执行方式。
如果是串行队列,队列中的任务执行时按顺序的执行。先添加进去的任务执行完毕,后面的任务再被取出放进对应的线程执行。
如果是并发队列,队列中的任务执行可以支持同时将队列中的多个任务同时放在不同线程并发执行。
// label 队列的名字
// 队列的类型 DISPATCH_QUEUE_CONCURRENT并发 DISPATCH_QUEUE_SERIAL串行
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_CONCURRENT);
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL);
当任务添加进队列就需要执行了。GCD提供了两个函数执行队列中的任务。dispatch_async
和dispatch_sync
。这两个函数只决定有没有开线程的能力。
- dispatch_async具备开启新的线程执行任务。
- dispatch_sync不具备开启新的线程,只能在当前线程执行任务。
总结:
* dispatch_async + 并发队列: 开启多条线程并发执行任务
* dispatch_async + 串行队列: 开启一条线程串行发执行任务
// 创建串行队列
dispatch_queue_t queue = dispatch_queue_create("com.coderhong.studyProj", DISPATCH_QUEUE_SERIAL);
// 将任务添加三个队列
dispatch_async(queue, ^{
// 添加任务1
NSLog(@"----------------------1%@", [NSThread currentThread]);
NSLog(@"----------------------1%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务2
NSLog(@"----------------------2%@", [NSThread currentThread]);
NSLog(@"----------------------2%@", [NSThread currentThread]);
});
dispatch_async(queue, ^{
// 添加任务3
NSLog(@"----------------------3%@", [NSThread currentThread]);
NSLog(@"----------------------3%@", [NSThread currentThread]);
});
上面代码中我们往串行队列中添加了三个任务,使用了GCD异步函数执行,具备开线程的能力。系统此时会开启一条子线程按顺序将三个任务放进子线程中执行.
同理如果我们将队列改为并发队列。系统会开启多条线程分别将三个任务放入不同线程同时执行。开启的线程条数有系统决定。
上面通过GCD将我们的任务放在子线程中执行。队列使我们自己创建的,其实系统提供了全局的队列供我们使用。dispatch_get_main_queue和dispatch_get_global_queue
。
/**
* identifier 队列的有先级 通常传递default
* flags 一般传0
*/
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
iOS开发系列-GCD的更多相关文章
- iOS开发系列--并行开发其实很容易
--多线程开发 概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的, ...
- iOS开发系列
因为最近面试了一些人,校招.初中级.高级.架构师,各种级别的,发现大家水平差异很大,有的高级的工程师很多问题都回答不上来,所以想梳理下iOS的知识点,写成一个系列,如果时间允许的话,会录制成视频放到网 ...
- iOS开发系列--Swift语言
概述 Swift是苹果2014年推出的全新的编程语言,它继承了C语言.ObjC的特性,且克服了C语言的兼容性问题.Swift发展过程中不仅保留了ObjC很多语法特性,它也借鉴了多种现代化语言的特点,在 ...
- iOS开发系列文章(持续更新……)
iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...
- iOS开发系列--App扩展开发
概述 从iOS 8 开始Apple引入了扩展(Extension)用于增强系统应用服务和应用之间的交互.它的出现让自定义键盘.系统分享集成等这些依靠系统服务的开发变成了可能.WWDC 2016上众多更 ...
- iOS开发系列--Swift进阶
概述 上一篇文章<iOS开发系列--Swift语言>中对Swift的语法特点以及它和C.ObjC等其他语言的用法区别进行了介绍.当然,这只是Swift的入门基础,但是仅仅了解这些对于使用S ...
- iOS开发系列--通知与消息机制
概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣的那么通过通知机制就可以告诉用户此时发生的事情.iOS中通知机制又叫消息机制,其包括两类:一类是本地 ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
随机推荐
- paper 16 : 计算机视觉领域博客资源
这是收录的图像视觉领域的博客资源的第一部分,包含:中国内地.香港.台湾 这些名人大家一般都熟悉,本文仅收录了包含较多资料的个人博客,并且有不少更新,还有些名人由于分享的paper.code或者数据集不 ...
- NX二次开发-UFUN点收集器UF_UI_select_point_collection
#include <uf.h> #include <uf_ui.h> UF_initialize(); //点收集器 char sMessage[] = "点收集器& ...
- NX二次开发-设置尺寸的附加尺寸UF_DRF_set_appended_text
#include <uf.h> #include <uf_drf.h> #include <uf_obj.h> #include <uf_part.h> ...
- NX二次开发-UFUN创建B面UF_MODL_create_bsurf
NX9+VS2012 #include <uf.h> #include <uf_modl.h> //创建一个B面 ;//U方向极数 ;//V方向极数 ;//U方向规则 ;//V ...
- [NOI.AC] palindrome
思路: \(50pts\) \(f[l,r]\)表示区间\([l,r]\)能够变成多少个串,转移枚举\(l\),利用\(hash\)判字符串相等. 复杂度\(O(Tn^3)\) \(70pts\) 考 ...
- Java-javaFx库运用-时钟显示
JavaFx是开发Java GUI程序的新框架.JavaFX应用可以无缝地在桌面或web浏览器中运行.具有内建的2D.3D动画支持,以及视频和音频的回放功能,可以作为一个应用独立运行或者在浏览器中运行 ...
- 深入理解 js为什么没有函数重载,如何实现函数重载?
我的新博客 http://www.suanliutudousi.com/2017/08/24/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3-js%E4%B8%BA%E4%B ...
- ASP.NET 页面的生命周期
本文转载自清风飘过的博客,地址:http://www.cnblogs.com/couhujia/archive/2010/04/23/1718405.html 页面生命期分三个阶段:建立阶段,回发阶段 ...
- Jquery操作的是内存数据,H5 dataset操作的是dom属性
Jquery操作的是内存数据,H5操作的是dom属性
- bcolz
raise Exception("this is an ex") bcolz总结: 0.需要用bcolz的columns需要为ndarray的列,不能直接拿list去赋值,因为我发 ...