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),^{ });//异步在新的线程 ...
随机推荐
- Tomcat 下配置OpenLayers proxy.cgi代理
摘要:在OpenLayers访问WFS服务时,会遇到跨域的问题而导致服务无法访问.此时,需要在应用程序中设置代理,通过代理进行访问.本文介绍在tomcat进行proxy.cgi文件配置,以及在调用代理 ...
- [Hive - LanguageManual] Statistics in Hive
Statistics in Hive Statistics in Hive Motivation Scope Table and Partition Statistics Column Statist ...
- vim对erlang语法支持
发现vim写erlang代码语法缩进都不对,后来发现vim是7.0的,vim7.3开始才对erlang这块进行了支持,所以升级vim git上下载源码包,然后一系列配置安装 http://www.2c ...
- 问题-某个程序改了ICO图标后编译后还是显示老图标?
问题现象:某个程序改了ICO图标后编译后还是显示老图标? 问题原原:可能是因为系统的缓存问题. 问题处理:把程序的EXE放在别的路径下打开就可以了. 问题相关人员:QQ253120114(朋友) Q ...
- ZOJ 3903 Ant(数学,推公示+乘法逆元)
Ant Time Limit: 1 Second Memory Limit: 32768 KB There is an ant named Alice. Alice likes going ...
- keil中编译时出现*** ERROR L107: ADDRESS SPACE OVERFLOW
解决方法: http://zhidao.baidu.com/link?url=DWTVVdALVqPtUt0sWPURD6c1eEppyu9CXocLTeRZlZlhwHOA1P1xdesqmUQNw ...
- Codeforces 600B Queries about less or equal elements(二分查找)
Description You are given two arrays of integers a and b. For each element of the second array bj yo ...
- DATASNAP为支持FIREDAC而增加的远程方法的数据类型TFDJSONDataSets
前面的博客提到用FIREDAC全面替代COM那一套东西:DATAPROVIDER,OLEVARIANT,CLIENTDATASET,DBEXPRESS... 显然,DATASNAP的远程方法必须增加对 ...
- Intel HAXM
Hardware Accelerated Execution Manager的缩写. intel的硬件加速执行管理器,是一款可以使用英特尔虚拟化技术(VT)加快 Android* 开发速度的硬件辅助虚 ...
- Unity3D之Mecanim动画系统学习笔记(四):Animation State
动画的设置 我们先看看Animation Clip的一些设置: Loop time:动画是否循环播放. 下面出现了3个大致一样的选项: Root Transform Rotation:表示为播放动画的 ...