//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. MFC关闭子窗口 如何把父窗口也一起关闭

    在子窗口OnClose() 消息里添加: GetParent()->DestroyWindow();//子窗口关闭 父窗口也同样关闭

  2. Android工程文件下assets文件夹与res文件夹的区别

    1.assets:不会在R.java文件下生成相应的标记,assets文件夹可以自己创建文件夹,必须使用AssetsManager类进行访问,存放到这里的资源在运行打包的时候都会打入程序安装包中, 2 ...

  3. iOS开发——UI进阶篇(二)自定义等高cell,xib自定义等高的cell,Autolayout布局子控件,团购案例

    一.纯代码自定义等高cell 首先创建一个继承UITableViewCell的类@interface XMGTgCell : UITableViewCell在该类中依次做一下操作1.添加子控件 - ( ...

  4. C#高级编程笔记 Day 3, 2016年9月 8日 抽象类

    1.虚方法:把一个基类函数声明为 virtual,就可以在任何派生类中重写该函数. 2.在Java 中所有函数都是虚拟的,但是在C# 中,C# 要求在派生类的函数重写另一个函数时,要使用 overri ...

  5. hough变换检测线和圆

    参考:http://blog.163.com/yuyang_tech/blog/static/21605008320130233343990/ 这篇介绍的基本思想. http://www.cnblog ...

  6. HTTP协议详解篇(待续)

    1.工作流程 HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务 ...

  7. Maven打包排除不需要的文件。

    pom.xml <!-- package打包排除掉一些配置文件 --> <plugin> <groupId>org.apache.maven.plugins< ...

  8. c# Dictionary的遍历和排序

    c# Dictionary的遍历和排序 c#遍历的两种方式 for和foreach for: 需要指定首位数据.末尾数据.数据长度: for遍历语句中可以改变数据的值: 遍历规则可以自定义,灵活性较高 ...

  9. An exception occurred during a WebClient request

    System.Net.WebException was caught HResult=-2146233079 Message=An exception occurred during a WebCli ...

  10. mysql中表名是order的CRUD的错误

    org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: com.mysql.jdbc. ...