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),^{ });//异步在新的线程 ...
随机推荐
- 纯CSS基于窗口垂直居中
都是IE8+的 <!DOCTYPE html> <html> <head> <title>基于窗口垂直居中 by 司徒正美</title> ...
- Spring dependency checking with @Required Annotation
Spring's dependency checking in bean configuration file is used to make sure all properties of a cer ...
- thymeleaf的url属性
一.使用表达式形式:@{...} 例如: <a th:href="@{http://localhost:8080/gtvg/order/details}">view&l ...
- 前端的一些常用DOM和事件归纳
1.document.getElementById(id); document.getElementByTagName(tagName); document.getElementsByNa ...
- 学习LINQ,发现一个好的工具。LINQPad!!
今日学习LINQ,发现一个好的工具.LINQPad!! 此工具的好处在于,不需要在程序内执行,直接只用工具测试.然后代码通过即可,速度快,简洁方便. 可以生成其LINQ查询对应的lambda和SQL语 ...
- SQL Select的执行顺序
1.FROM 2.ON 3.JOIN 4.WHERE 5.GROUP BY 6.WITH CUBE or WITH ROLLUP 7.HAVING 8.SELECT 9.DISTINCT 10.ORD ...
- Flex友好提示、警告
Flex 自带的Alert带给用户的体验并不好,对于一些简单的提示来说,这个小题大作了. <?xml version="1.0" encoding="utf-8&q ...
- mysql中utf8_bin、utf8_general_ci、utf8_general_cs编码区别
在mysql中存在着各种utf8编码格式,如下表: 1)utf8_bin 2)utf8_general_ci 3)utf8_general_cs utf8_bin将字符串中的每一个字符用二进制数据存储 ...
- poj2105 IP Address(简单题)
题目链接:id=2105">http://poj.org/problem?id=2105 ----------------------------------------------- ...
- BZOJ 1005: [HNOI2008]明明的烦恼 Purfer序列 大数
1005: [HNOI2008]明明的烦恼 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...