//3 GCD(充分利用设备的多盒)-------------
屏蔽了线程,只能看见任务 队列
步骤两步,定制任务,将任务添加到队列。GCD将添加的任务,放到线程中去执行,自动执行,自动释放
原则:先进先出,先添加的任务先执行,有别于栈的先进后出,先添加的任务后执行

-------GCD---

GCD有两个用来执行任务的函数:同步函数,异步函数
同步:按顺序执行任务,同一条线程执行(不开线程)
异步:同时执行任务(开启新线程)

同步,异步,并发,串行
同步:当前线程执行,不具备开启新线程的能力
异步:在新线程执行,具备开启新线程的能力
并发:多个任务同时执行,
串行:一个任务执行完毕,在执行下一个任务

<1> 创建全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)
注释:建立一个全局队列,优先级为默认(队列的调度频率为默认),后面默认0,苹果官方说明,以后可能会有用,
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:决定是否开启线程的是函数async,异步则开启新线程,全局队列属于并发队列,即为任务可以同时执行,则执行方案为,开启三条线程(非主线程的三条新线程),同时执行三个任务。
若函数为sync,即为同步函数,同步不会开启新线程(即在当前线程中执行任务),主队列的并发则失去意义,任务是依次执行的,so 和串行一样了

<2>创建串行队列
dispatch_queue_t queue = dispatch_queue_creat("NiuBiDe.queue",NULL);
注释:""中为串行队列的名称
dispatch_async(queue,)^{
NSLog(@"---任务1---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务2---%@",[NSThread currentThread]);
}
dispatch_async(queue,)^{
NSLog(@"---任务3---%@",[NSThread currentThread]);
}
分析:async为异步函数,则会开启新线程,串行队列为非并发队列,则执行方案为开启新的线程 在这条线程中依次执行1,2,3任务
若为同步函数,则在主线程中依次执行三个任务

<3>创建主队列
dispatch_queue_t queue = dispatch_get_main_queue();
主队列是特殊的串行队列 无论同步异步都都会在主线程中执行任务
切忌:如果在主线程中执行同步方法会出现死锁现象,所以主线程中需用异步主队列执行任务操作
应用:多用于处理耗时操作的子线程中 处理UI显示问题,创建主线程 异步显示UI之用

GCD总结:

dispatch_async(sync)(全局队列/主队列/串行队列)block^{
}

表格----
全局队列 串行队列 主队列

同步 不开启新线程 不开启新线程 不开启新线程
任务串行执行 任务串行执行 串行执行任务

异步 开启线程 开启线程 不开启线程
任务并发执行 任务串行执行 任务串行执行

其他用法:
- 延迟调用
对比 [self performSelected:@selected(run)withObject:nil afterDealy:2.0];当前线程延迟2.0秒调用run方法

dispatch_after(DISPATCH_TIME_NOW,(int64_t)(3.0* NSEC_PER_SEC),dispatch_get_main_queue()))^{

}
注释:dispatch_get_main_queue()即为在主队列中执行延迟操作,如果换成
全局队列则会在其他线程中执行操作!~ 牛B!~

- 一次性代码
dispatch_once ^{
}
注释:保证在整个程序运行中此代码只执行一次!~

- 队列组(神奇!~)
应用场景:当两个耗时操作都完成后,才操作UI显示,两个图片下载完毕后,合并显示在UI上

//创建队列组
dispatch_group_t group = dispatch_group_creat();

//开启下载任务1
dispatch_group_async(group,global_queue,^{
//还是操作1
})];

//开启下载任务2
dispatch_group_async(group,global_queue,^{
//还是操作2
})];

//等gruop中的任务都执行完毕,在执行其他操作
dispatch_group_notify(group,main_queue^{

//在主线程中,处理显示UI细节。
})];

ios 多线程小结----- GCD篇的更多相关文章

  1. iOS开发之多线程技术——GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  2. iOS开发之多线程技术—GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  3. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  4. [iOS]多线程和GCD

    新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...

  5. iOS 多线程 之 GCD(大中枢派发)(一)

    导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...

  6. IOS多线程(GCD)

    简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...

  7. IOS 多线程 NSOperation GCD

    1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...

  8. iOS 多线程之 GCD 的基本使用

    什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU ...

  9. iOS 多线程 之 GCD(大中枢派发)(二)

    本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...

随机推荐

  1. PHP Socket实现websocket(一)基本函数介绍

    WebSocket protocol 是HTML5一种新的协议.它实现了浏览器与服务器全双工通信(full-duplex). 一开始的握手需要借助HTTP请求完成. WebSocket是基于TCP来实 ...

  2. keepalived安装

    两台虚拟机 两台配置操作一样 环境配置 [root@lb01 /]# yum -y install openssl openssl-devel [root@lb01 /]# yum -y instal ...

  3. 信号屏蔽的切换的理解sigsuspend

    #include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h&g ...

  4. Effective Java 读书笔记之八 异常

    一.只针对异常的情况才使用异常 1.类具有状态相关的方法时,可采用状态测试方法和可识别的返回值两个策略. 二.对可恢复的情况使用受检异常,对编程错误使用运行时异常 1.期望调用者能够适当恢复的情况,应 ...

  5. iOS权限管理思路

    iOS权限的分类: 1.功能级权限管理 2.数据级权限管理 权限的获取方式: 通常通过网络获取,会有延迟 使用到权限的场景: 1. 点击发送会员专享魔法表情,  判断是否有发送会员专享魔法表情的权限, ...

  6. cvLoadImage

    编辑 本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 函数原型:IplImage* cvLoadImage( const char* filename, int flags= ...

  7. qmake的使用

    [TOC] 本文由乌合之众 lym瞎编,欢迎转载 blog.cnblogs.net/oloroso 本文由乌合之众 lym瞎编,欢迎转载 my.oschina.net/oloroso *** 还是先说 ...

  8. composer 的使用

    composer是php包管理工具,非常好用!许多框架,例如zendframework都可以用它来安装. 使用起来其实是很简单的.以下以windowns操作系统为例: 把php添加到系统环境变量.(网 ...

  9. 5.2---小数的二进制表示(CC150)

    public static String printBin(double num) { StringBuffer str = new StringBuffer(); str.append('0'); ...

  10. 在sublime-text中设置浏览器预览

    配置在Chrome,Firefox中打开 安装 SideBarEnhancements 然后通过ctrl + k, ctrl + b打开侧边栏,在侧边栏的文件中右击,找到 open width -&g ...