ios 多线程小结----- GCD篇
//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篇的更多相关文章
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发之多线程技术—GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- IOS 多线程 NSOperation GCD
1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...
- iOS 多线程之 GCD 的基本使用
什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU ...
- iOS 多线程 之 GCD(大中枢派发)(二)
本文接着上一篇讲.主要讲:dispatch_source. dispatch_source主要用户监听事件,可以监听如下事件 DISPATCH_SOURCE_TYPE_DATA_ADD DISPATC ...
随机推荐
- linux 中断理解
1.进程.线程只针对的是应用层,而内核调用.驱动没有这种概念,调用的都是内核调用里相同的函数或变量,所以应用层多个应用操作同个硬件时,特别是要加互斥操作,8250通过cs针脚决定发送数据给哪个串口 2 ...
- git之远程标签下载(远程分支)
一般我们发布一个新版本到线上服务器时都会在版本库中打一个标签,这样我们可以随时查看这个打标签的版本,就是说标签其实是版本库中一个快照.git的标签与分支类似,区别是分支是可变的而标签是不可变.接下来我 ...
- SQLite 数据库调研
SQLite数据库的特点(转载的): ★技术上的优点和特性 SQLite是一个轻量级.跨平台的关系型数据库.既然号称关系型数据库,支持SQL92标准中常用的玩意儿(比如视图.事务.触发器等)就是理所当 ...
- Codeforces 260 C. Boredom
题目链接:http://codeforces.com/contest/456/problem/C 解题报告:给出一个序列,然后选择其中的一个数 k 删除,删除的同时要把k - 1和k + 1也删除掉, ...
- 如何在 CentOS 7 用 cPanel 配置 Nginx 反向代理
导读 Nginx 是最快和最强大的 Web 服务器之一,以其高性能和低资源占用率而闻名.它既可以被安装为一个独立的 Web 服务器,也可以安装成反向代理 Web 服务器.在这篇文章,我将讨论在安装了 ...
- objc/runtime
"T@\"MyInnerObject\",&,N,V_myInnerObject" MyInnerObject "Td,N,V_cgfloat ...
- Android学习笔记(十九)——内容提供器
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 内容提供器(Content Provider)主要用于在不同的应用程序之间实现数据共享的功能,它提供了一套完整 ...
- IPC-----POSIX消息队列
消息队列可以认为是一个链表.进程(线程)可以往里写消息,也可以从里面取出消息.一个进程可以往某个消息队列里写消息,然后终止,另一个进程随时可以从消息队列里取走这些消息.这里也说明了,消息队列具有随内核 ...
- tomcat有哪些性能调优方法
前几天看见一篇介绍性能调优文章,觉得不错.特此收藏(http://blog.csdn.net/lifetragedy/article/details/7708724)
- centos vim配置高亮语法和格式化粘贴
centos vim配置高亮语法和格式化粘贴 设置vim别名和高亮grep词语 echo -e "\nalias vi=vim\nalias grep='grep --color'\n&qu ...