GCD的相关函数使用
GCD
是iOS多线程实现方案之一,非常常用
英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器
是苹果公司为多核的并行运算提出的解决方案
1.一次性函数
dispatch_once
顾名思义是只执行一次的函数,注意是整个程序中只执行一次(单例模式常用到)
- (void)once {
//一次性函数,只执行函数
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
//里面默认线程安全的
NSLog(@"------run");
});
}
2.栅栏函数
dispatch_barrier_async
作用就是控制多线程的执行顺序
- (void)barrier {
dispatch_queue_t queue = dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{
NSLog(@"_______1--------%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"_______2--------%@",[NSThread currentThread]);
});
//像栅栏一样,让上面的先执行完,再执行下面的
dispatch_barrier_async(queue, ^{
NSLog(@"----barrier-----%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"_______3--------%@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"_______4--------%@",[NSThread currentThread]);
});
}
3.快速迭代函数
dispatch_apply
作用就是开启多个线程同时完成某一件事,例如同时下载多张图片
//一般的做法
- (void)cutFromFileTo {
//一般在子线程中做
//创建并行队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
dispatch_async(queue, ^{
//起始路径
NSString *from = @"/Users/DDZ/Desktop/From";
//目标路径
NSString *to = @"/Users/DDZ/Desktop/To"; NSFileManager *mgr = [NSFileManager defaultManager];
//获取起始路径中所有文件路径
NSArray *subpaths = [mgr subpathsAtPath:from]; for (int i = ; i < subpaths.count; i++) { //将路径字符串进行拼接
NSString *fromFullPath = [NSString stringWithFormat:@"%@/%@",from,subpaths[i]];
NSString *toFullPath = [NSString stringWithFormat:@"%@/%@",to,subpaths[i]]; [mgr moveItemAtPath:fromFullPath toPath:toFullPath error:nil]; }
NSLog(@"剪切成功"); });
}
//使用快速迭代进行剪切
- (void)cutFileApply {
//起始路径
NSString *from = @"/Users/DDZ/Desktop/From";
//目标路径
NSString *to = @"/Users/DDZ/Desktop/To"; NSFileManager *mgr = [NSFileManager defaultManager];
//获取起始路径中所有文件路径
NSArray *subpaths = [mgr subpathsAtPath:from]; dispatch_apply(subpaths.count, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^(size_t index) { NSString *subpath = subpaths[index];
//将路径字符串进行拼接
NSString *fromFullPath = [NSString stringWithFormat:@"%@/%@",from,subpath];
NSString *toFullPath = [NSString stringWithFormat:@"%@/%@",to,subpath]; //剪切
[mgr moveItemAtPath:fromFullPath toPath:toFullPath error:nil]; }); }
一般的方法只能一张图片剪切完之后,再进行下一张得剪切
而使用快速迭代则可以同时进行剪切。
4.队列组
dispatch_group_async
与栅栏函数有相同的目的,为了控制多线程的执行顺序
例如下载两张图片之后,再将这两者合并成新的图片并显示。
必须得先下完之后才能合并吧!(顺序问题,多线程是不可控的)
//队列组
- (void)group { //创建组
dispatch_group_t group = dispatch_group_create(); dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ); //1.下载图片1
dispatch_group_async(group, queue, ^{ //实现下载
NSURL *url = [NSURL URLWithString:@"http://g.hiphotos.baidu.com/image/pic/item/6c224f4a20a446230761b9b79c22720e0df3d7bf.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
//生成图片
self.img1 = [UIImage imageWithData:data]; }); //2.下载图片2
dispatch_group_async(group, queue, ^{ //实现下载
NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.baidu.com/image/pic/item/b812c8fcc3cec3fd5b9db074d488d43f8794270b.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
self.img2 = [UIImage imageWithData:data]; }); //3.将图片1,图片2合成一张新的图片
dispatch_group_notify(group, queue, ^{
//开启新的图形上下文
UIGraphicsBeginImageContext(CGSizeMake(, )); //绘制图片
[self.img1 drawInRect:CGRectMake(, , , )]; [self.img2 drawInRect:CGRectMake(, , , )]; //取得上下文中的图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //结束上下文
UIGraphicsEndImageContext(); //回到主线程显示图片
dispatch_async(dispatch_get_main_queue(), ^{
//4.将新图片显示出来 self.imageView.image = image;
}); }); }
5.延时(补充)
- (void)delay {
//延时
NSLog(@"______");
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
}
- (void)run {
NSLog(@"end");
}
GCD的相关函数使用的更多相关文章
- iOS中GCD的使用小结
http://www.jianshu.com/p/ae786a4cf3b1 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列类型 Th ...
- GCD
Grand Central Dispatch(GCD)包含语言特点.运行库和系统增强功能,它提供系统的.综合的改进,进而去支持并发代码在iOS和OSX多核硬件上的执行. 子系统.CoreFoundat ...
- iOS多线程知识总结--GCD
iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...
- [转]关于GCD与多线程
GCD是什么,你知道吗?你知道了GCD,你确定你会使用吗? 这一篇文章是站在初学者角度去分析GCD,原因是这个很多iOS开发者根本就没用过,即使用过,不知道其中的原理.讲解之前认识一下什么是线程,为什 ...
- IOS开发GCD小结
0. Brief Introduction GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后 ...
- 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),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
随机推荐
- 魅力 .NET:从 Mono、.NET Core 说起
前段时间,被问了这样一个问题:.NET 应用程序是怎么运行的? 当时大概愣了好久,好像也没说出个所以然,得到的回复是:这是 .NET 程序员最基本的...呵呵! 微软开源,其实不只是对 .NET 本身 ...
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(二)
前言 上一篇随笔Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)介绍maven和nexus的环境搭建,以及如何使用maven和nexus统一管理库 ...
- Eclipse常用设置
用惯了VS,再回过去用Eclipse真是一件痛苦的事.so,在这里记录下使用过程中的一些设置以做备忘. 1.代码自动提示 在我们忘记方法名或者想偷懒时,代码自动提示很管用.不过Eclipse默认是输入 ...
- Entity Framework 6 Recipes 2nd Edition(9-6)译->管理断开时的并发
9-6. 管理断开时的并发 问题 想要确保只接受在WCF客户端并发令牌未被修改的实体. 解决方案 我们有一个如Figure 9-6所示的模型. Figure 9-6订单实体模型 我们想通过WCF服务来 ...
- java运行时获得泛型类型
引言 众所周知,java泛型最重要的特征是泛型擦除,所有泛型在编译时会转换成Object所以在java中运行时无法获得泛型的类型. 但是其实以上的规则是针对方法的内部变量的,如果是其他形式的泛型其实是 ...
- 反编译.NET工程
工具: 1. .Net Reflector 2. 远程桌面 步骤: 1. 远程桌面连接到服务器 IP,port,user,pwd 2. 打开 IIS 这里面就是所部属的网 ...
- Ubuntu 14.04 中 安装elasticsearch2.*+logstash2.*+kibana
在Ubuntu 14.04 上安装单机版ELK 2.*(脚本化) 1.判断是否为root权限 if [ "${UID}" -ne 0 ]; then echo "You ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统--工作流演示截图
- angular2系列教程(四)Attribute directives
今天我们要讲的是ng2的Attribute directives.顾名思义,就是操作dom属性的指令.这算是指令的第二课了,因为上节课的components实质也是指令. 例子
- jQuery的DOM操作实例(2)——拖拽效果&&拓展插件
一.原生JavaScript编写拖拽效果 二.jQuery编写的拖拽效果 三.在jQuery中拓展一个拖拽插件