GCD 的使用
//
// ZYGCDViewController.h
// Thread
//
// Created by wanglixing on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import <UIKit/UIKit.h> @interface ZYGCDViewController : UIViewController @end
//
// ZYGCDViewController.m
// Thread
//
// Created by wanglixing on 14/11/4.
// Copyright © 2014年 zzz. All rights reserved.
// #import "ZYGCDViewController.h" @interface ZYGCDViewController () @end @implementation ZYGCDViewController - (void)viewDidLoad {
self.view.backgroundColor = [UIColor whiteColor];
} - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
//GCD 在实现多线程的时候有两个优点:
//1.可以充分利用多核处理器的性能。
//2.使用起来简单方便,不需要管理线程的生命周期,可以使我们更关注于需要在线程中执行的任务。 //GCD 使用队列(queue)管理线程。队列一般分两种:
//1.运行在主线程的队列,mainQueue。一次只能执行一个任务,遵循先进先出的原则(FIFO),串行队列。
//获得 mainQueue 队列。
dispatch_queue_t mainQueue = dispatch_get_main_queue(); //2.运行在分线程的队列,四个优先级不同的 globalQueue。并行队列,同时可以执行多个任务。globalQueue 管理了一组的分线程,实际运行的时候使用哪一个分线程,我们是不能控制的。 //#define DISPATCH_QUEUE_PRIORITY_HIGH 2
//#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
//#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
//#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN //第一个参数是优先级,第二个参数无意义。
dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); //只需要把任务提交到队列中,任务就会在对应的线程中执行了。
//同步,阻塞线程,等待任务执行完毕才继续执行后续代码。
//异步,同时执行。
//同步提交,如果在主线程使用,会导致线程死锁。
// dispatch_sync(<#dispatch_queue_t queue#>, <#^(void)block#>); // NSLog(@"=========");
//
// dispatch_sync(mainQueue, ^{
// NSLog(@"----------");
// });
//
// NSLog(@"+++++++++++"); //异步提交,一般只使用这种方法。
dispatch_async(mainQueue, ^{
//block 的内容在主线程执行。 if ([NSThread isMainThread]) {
NSLog(@"主线程");
}else {
NSLog(@"分线程");
}
}); dispatch_async(globalQueue, ^{
//block 的内容在分线程执行。 if ([NSThread isMainThread]) {
NSLog(@"=====主线程");
}else {
NSLog(@"=====分线程");
}
}); //串行队列,先进先出,依次执行。
// dispatch_async(mainQueue, ^{
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// });
//
// dispatch_async(mainQueue, ^{
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// });
//
// dispatch_async(mainQueue, ^{
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// });
//
// dispatch_async(mainQueue, ^{
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// }); //并行队列,多个任务同时执行。
// dispatch_async(globalQueue, ^{
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// NSLog(@"11111111111");
// });
//
// dispatch_async(globalQueue, ^{
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// NSLog(@"22222222222");
// });
//
// dispatch_async(globalQueue, ^{
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// NSLog(@"33333333333");
// });
//
// dispatch_async(globalQueue, ^{
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// NSLog(@"44444444444");
// }); //可以自定义队列,但是一般用不上,系统提供给我们的两个已经够用了。
// dispatch_queue_create("com.www.zhiyou", nil); //系统的某些方法也会用到 mainQueue 和 globalQueue。 //通常这样使用 GCD。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
//去分线程执行代码。
dispatch_async(dispatch_get_main_queue(), ^{
//切回主线程,刷新 UI。
});
}); //下载图片。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
//下载图片。dataWithContentsOfURL 是同步请求。
NSData* data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://xxx/1.jpg"]]; UIImage* image = [UIImage imageWithData:data]; //切换回主线程。
dispatch_async(dispatch_get_main_queue(), ^{
UIImageView* imageView = [[UIImageView alloc] initWithImage:image]; [self.view addSubview:imageView]; [imageView release];
});
}); //等待某些任务执行完毕后,再去执行另外一个任务。
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
// 下载图片1。
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
}); dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
//下载图片2。
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
}); //等待 group 中的全部任务执行完毕,才会执行这里的任务。
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
NSLog(@"");
});
} @end
GCD 的使用的更多相关文章
- Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用
OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...
- iOS 多线程之GCD的使用
在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...
- 【swift】BlockOperation和GCD实用代码块
//BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...
- 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!
多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
- GCD的相关函数使用
GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾 ...
- hdu1695 GCD(莫比乌斯反演)
题意:求(1,b)区间和(1,d)区间里面gcd(x, y) = k的数的对数(1<=x<=b , 1<= y <= d). 知识点: 莫比乌斯反演/*12*/ 线性筛求莫比乌 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2820: YY的GCD [莫比乌斯反演]【学习笔记】
2820: YY的GCD Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1624 Solved: 853[Submit][Status][Discu ...
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- GCD总结
//用block只有两种:同步执行/异步执行(参数1:队列;参数二:任务) dispatch_async(dispatch_get_global_queue(0, 0),^{ });//异步在新的线程 ...
随机推荐
- 深入理解jQuery插件开发(转)
转自:http://blog.jobbole.com/30550/ 如果你看到这篇文章,我确信你毫无疑问会认为jQuery是一个使用简便的库.jQuery可能使用起来很简单,但是它仍然有一些奇怪的地方 ...
- Python 发送邮件包含附件报表示例
之前需要用Python发送报表邮件,在网上找了下资料,基本上符合要求了. 相关的示例如下,懂python的人应该都知道. from email.mime.text import MIMEText fr ...
- DelphiXE8怎么使用调试模式
需求:在开发Android程序时,大家一直是使用ShowMessage.其实XE是支持下断点的. 操作: 1.小米手机用USB线,连到电脑上. 2.小米手机-设置-关于手机-"MIUI版本& ...
- thymeleaf中的条件判断用法
一.简单的条件:“if”和“unless” th:if用法实例: <table> <tr> <th>NAME</th> <th>PRICE& ...
- 微信读书 iOS 性能优化总结
微信读书作为一款阅读类的新产品,目前还处于快速迭代,不断尝试的过程中,性能问题也在业务的不断累积中逐渐体现出来.最近的 1.3.0 版本发布后,关于性能问题的用户反馈逐渐增多,为此,团队开始做一些针对 ...
- 编译小结(6)认识Automake
我前面说了很多如何用gcc或 Makefile怎么编译的东东,但在Linux下装过软件的都应当见过,很多源码安装的包是用Automake 来编译的.输入下"./configur ...
- 自己学会汉化DevExpress控件[转]
1. 文档导读 本文档以颜色区分内容的重要性和不同性,阅读本文档时请注意以下事项: 1. 红色部分表示需要注意的重点内容:(加粗的尤甚) 2. 蓝色部分表示相应于前版本新增的内容: 3. 紫色部分表示 ...
- ssl配置
Apache SSL配置 作者: JeremyWei | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://weizhifeng.net/apache-ssl.h ...
- Failed to load session “ubuntu” -- 12.04
在使用ubuntu 12.04的时候,之前不喜欢Unity桌面,就按照网上提示的安装了Gnome桌面,并且成功了! 可是,最近又想把Unity装回来,心想,这不就是安装一软件的活嘛,很简单!于是就卸载 ...
- Cocos2d-x——Cocos2d-x 屏幕适配新解 – 兼容与扩展【转载】
Cocos2d-x 屏幕适配新解 – 兼容与扩展 本文出自[无间落叶](转载请保留出处):http://blog.leafsoar.com/archives/2013/05-13-08.html 在读 ...