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),^{ });//异步在新的线程 ...
随机推荐
- 《Genesis-3D开源游戏引擎完整实例教程-2D射击游戏篇01:播放序列动画》
1.播放序列动画 系列动画播放概述 2D游戏中的动画系统,不同于3D游戏.3D游戏中,角色美术资源不仅包含角色模型的,还包括角色的贴图和动作等,模型本身自带角色的动作动画效果.2D游戏中,角色美术资源 ...
- Emacs Lisp 功能扩展集锦
http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html Emacs 具有超强的扩展性.这是当今没有任何其它编辑器可以比拟 的强大特点. ...
- curl命令的基本用法
我们知道在linux环境下,可以调用curl下载网页. 但curl有些高级的应用,只需要几行命令行,可能比你写多行php.python.C++的程序要快些. 下面从问题驱动的角度来谈谈curl的用法 ...
- jquery easyui添加图标扩展
easyui中有很多通过iconCls="icon-reload"这样的属性引入小图标显示,当然我们也可以自己添加自己的小图标. 方式:1.我们可以在jquery easyui的文 ...
- codeforces 651A Joysticks
A. Joysticks time limit per test 1 second memory limit per test 256 megabytes input standard input o ...
- TextKit学习(三)NSTextStorage,NSLayoutManager,NSTextContainer和UITextView
先上一张图: 这是使用UITextView时用到的iOS7新增加的类:NSTextContainer.NSLayoutManager.NSTextStorage及其相互关系: 这三个新出的类还没有在官 ...
- 在线教育服务:http://www.ablesky.com/
在线教育服务:http://www.ablesky.com/
- hdu 4578 Transformation(线段树)
线段树上的多操作... 题目大意: 树上 的初始值为0,然后有下列三种操作和求和. 1 x y c 在X-Y的之间全部加上C. 2 x y c 在X-Y的之间全部乘上C. 3 x y c ...
- ecshop以幻灯版调用首页主广告显示
默认的是index_ad.lbi模板有一个$flash变量了,但在搜索搜索没发现 <!--{foreach from=$flash name=no item=flash}--> <l ...
- 8086、80x86(IA-32)、64(IA-64)位CPU发展
众所周知,CPU(中央处理单元)是计算机的核心部分,CPU在单位时间内能一次处理的二进制数的位数叫字长,从386.486直到奔腾系列的CPU都是32位,大多数情况32位计算已经能满足现阶段人们的需要. ...