GCD全称Grand Central Dispatch。可译为“大派发中枢调度器”,以纯C语言写成,提供了很多很强大的函数。GCD是苹果公司为多核的并行运算提出的解决方式,它能够自己主动利用很多其它的CPU内核来參与运算。会自己主动管理线程的生命周(创建线程、调度任务、销毁线程)。而程序猿仅仅须要告诉GCD想要运行什么任务,不须要编写不论什么线程管理代码!

     GCD中有两个核心概念,一是任务。二是队列。
     任务:要运行什么样的操作。任务都是预先以Block封装好准备要运行的一段代码。
     队列:用来存放任务,依照先进先出的方式,调度任务在哪一条线程上运行。
     GCD中有两个用来运行任务的函数,各自是同步函数和异步函数。

     同步函数:该函数的代码形式例如以下
dispatch_sync(dispatch_queue_t queue, ^(void)block)
  当中queue为队列,block为任务
  同步任务并不会创建线程,但会在当前线程(能够是子线程,页能够是主线程)中运行。同步任务有一个特性。仅仅要同步任务一加入到队列中就要立即运行。同步任务不运行完就不会运行往后的代码。

比如:
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 运行同步任务
dispatch_sync(q, ^{
// 让运行该任务的线程休眠2s
[NSThread sleepForTimeInterval:2.0];
NSLog(@"block - %@",[NSThread currentThread]);
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}

执行结果例如以下:


据此能够验证同步任务的特性

  异步函数:
dispatch_async(dispatch_queue_t queue, ^(void)block)
  普通情况下异步任务都会开启一条子线程在后台运行(有一种情况除外。后面会讲到),异步任务的一个特性就是不用等待当前线程的任务就能直接运行
比如:
- (void)viewDidLoad {
[super viewDidLoad];
// 获得全局队列
dispatch_queue_t q = dispatch_get_global_queue(0, 0);
// 运行异步任务
dispatch_async(q, ^{
//
for (int i = 0; i<10; i++) {
NSLog(@"block - %@ - %d",[NSThread currentThread],i);
}
});
NSLog(@"viewDidLoad - %@",[NSThread currentThread]);
}

执行结果例如以下:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMTA1ODczMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">


第二次执行结果:

能够看到两次执行结果不同,且不在同一线程中.
假设将代码改为例如以下形式:
- (void)viewDidLoad {
[superviewDidLoad];
//获得全局队列
dispatch_queue_t q =dispatch_get_global_queue(0, 0);
//运行异步任务
for (int i = 0; i< 10; i++) {
dispatch_async(q, ^{
NSLog(@"block - %@ - %d",[NSThreadcurrentThread],i);
}); }
NSLog(@"viewDidLoad - %@",[NSThreadcurrentThread]);
}

运行结果例如以下:

由此可得队列开启多少条我们无法控制。异步函数并不会等待当前线程(当前线程为主线程)的任务。

ios多线程操作(四)—— GCD核心概念的更多相关文章

  1. 刀哥多线程GCD核心概念gcd

    GCD GCD 核心概念 将任务添加到队列,并且指定执行任务的函数 任务使用 block 封装 任务的 block 没有参数也没有返回值 执行任务的函数 异步 dispatch_async 不用等待当 ...

  2. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  3. iOS多线程开发之GCD(基础篇)

    总纲: GCD基本概念 GCD如何实现 GCD如何使用 队列和任务组合 一.GCD基本概念 GCD 全称Grand Central Dispatch(大中枢队列调度),是一套低层API,提供了⼀种新的 ...

  4. iOS多线程开发之GCD(中篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  5. iOS多线程开发之GCD(中级篇)

    前文回顾: 上篇博客讲到GCD的实现是由队列和任务两部分组成,其中获取队列的方式有两种,第一种是通过GCD的API的dispatch_queue_create函数生成Dispatch Queue:第二 ...

  6. webpack的四个核心概念介绍

    前言 webpack 是一个当下最流行的前端资源的模块打包器.当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后 ...

  7. webpack2版本四个核心概念

    webpack 是一个现代的 JavaScript 应用程序的模块打包器(module bundler) 四个核心概念: --------------------------------------- ...

  8. webpack 四个核心概念

    webpack 是当下最热门的前端资源模块化和打包工具.它可以将许多松散的模块(如 CommonJs 模块. AMD 模块. ES6 模块.CSS.图片. JSON.Coffeescript. LES ...

  9. iOS多线程开发之GCD(死锁篇)

    上篇和中篇讲解了什么是GCD,如何使用GCD,这篇文章将讲解使用GCD中将遇到的死锁问题.有兴趣的朋友可以回顾<iOS多线程开发之GCD(上篇)>和<iOS多线程开发之GCD(中篇) ...

  10. (转)Maven学习总结(四)——Maven核心概念

    孤傲苍狼只为成功找方法,不为失败找借口! Maven学习总结(四)——Maven核心概念 一.Maven坐标 1.1.什么是坐标? 在平面几何中坐标(x,y)可以标识平面中唯一的一点. 1.2.Mav ...

随机推荐

  1. Django model 字段类型清单

    Django model字段类型清单 Django 通过 models 实现数据库的创建.修改.删除等操作,本文为模型中一般常用的类型的清单,便于查询和使用: AutoField 一个自动递增的整型字 ...

  2. 棘手的操作(bzoj 2333)

    Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: ...

  3. Dinic算法学习&&HDU2063

    http://www.cnblogs.com/SYCstudio/p/7260613.html 看这篇博文懂了一点,做题再体会体会吧 找了好久都没找到一个好用的模板…… 我也是佛了..最后决定用峰神的 ...

  4. webdiyer aspnet pager最近又用这个。还是记录下。

    这个是页面里的代码需要在上面引入: <%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer&quo ...

  5. 动态内存管理详解:malloc/free/new/delete/brk/mmap

    c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...

  6. Kotlin来了

    kotlin优点(主要是代码简洁度) 1.避免空指针异常,其次在一个文件中java方法必须写在class里面,而kotlin则没要求 2.在同一个文件中,有class a则不允许在class外的方法( ...

  7. c# GDI画图 双缓冲画图分析

    双缓冲绘图分析  1.Windows 绘图原理  我们在 Windows 环境下看到各种元素,如菜单.按钮.窗口.图像,从根本上说,都是“画”出来的.这时的屏幕,就相当于一块黑板,而 Windows ...

  8. Selenium2+python自动化11-定位一组元素find_elements【转载】

    前言 前面的几篇都是讲如何定位一个元素,有时候一个页面上有多个对象需要操作,如果一个个去定位的话,比较繁琐,这时候就可以定位一组对象. webdriver 提供了定位一组元素的方法,跟前面八种定位方式 ...

  9. ReportView控件的使用

    ReportView控件的使用Posted on 2012-01-06 17:02 随遇 阅读(3006) 评论(0)  编辑 收藏 最近使用了ReportView控件绑定数据,总结下: 1.在设计器 ...

  10. easyui常用

    清空列表选中项 //easyui datagrid 清空勾选 $('#List').datagrid('clearSelections'); 扩展修改查询方法 function QueryList() ...