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),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...
随机推荐
- Lesson 21 Mad or not?
Text Aeroplanes are slowly driving me mad. I live near an airport and passing planes can be heard ni ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- golang的安装
整理了一下,网上关于golang的安装有三种方式(注明一下,我的环境为CentOS-6.x, 64bit) 方式一:yum安装(最简单) rpm -Uvh http://dl.fedoraprojec ...
- SQL Server 在多个数据库中创建同一个存储过程(Create Same Stored Procedure in All Databases)
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 遇到的问题(Problems) 实现代码(SQL Codes) 方法一:拼接SQL: 方法二: ...
- 学习笔记之(console)
今天小颖在逛博客园时,发现一位帅锅写的有意思的Console小颖看了后,就自己敲了一遍嘻嘻,为了方便以后查看,小颖把它记录下来嘻嘻,有兴趣的小伙伴也可以自己试试哦. 格式占位符 作用 %s 字符串 % ...
- GDB调试命令
1.查看源码: list [函数名][行数] 2.暂停程序 (1)设置断点: a.break + [源代码行号][源代码函数名][内存地址] b.break ... if condition .. ...
- 对C语言islower、isupper、isdigit函数的测试
今天朋友问起了这三个函数,我就帮忙测试了下,测试后发现谭浩强第四版课本附录上上讲的不是很严谨. 我们先看下这三个函数介绍: 谭浩强第四版课本附录第396页上这样介绍: 函数名 函数原型 功能 返回值 ...
- php内核分析(五)-zval
这里阅读的php版本为PHP-7.1.0 RC3,阅读代码的平台为linux 实际上,从这个函数开始,就已经进入到了zend引擎的范围了. zend_eval_string_ex(exec_direc ...
- Performance Monitor3:监控SQL Server的内存压力
SQL Server 使用的资源受到操作系统的调度,同时,SQL Server在内部实现了一套调度算法,用于管理从操作系统获取的资源,主要是对内存和CPU资源的调度.一个好的数据库系统,必定在内存中缓 ...
- ChatSecure
ChatSecure是一个免费和开源消息传递应用程序的特性 OTR加密在 XMPP. 你可以连接到现有的谷歌帐户或创建新帐户 公共XMPP服务器(包括通过 Tor),甚至 连接到您自己的服务器额外的安 ...