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的相关函数使用的更多相关文章

  1. iOS中GCD的使用小结

    http://www.jianshu.com/p/ae786a4cf3b1 本篇博客共分以下几个模块来介绍GCD的相关内容: 多线程相关概念 多线程编程技术的优缺点比较? GCD中的三种队列类型 Th ...

  2. GCD

    Grand Central Dispatch(GCD)包含语言特点.运行库和系统增强功能,它提供系统的.综合的改进,进而去支持并发代码在iOS和OSX多核硬件上的执行. 子系统.CoreFoundat ...

  3. iOS多线程知识总结--GCD

    iOS多线程知识总结--GCD 1. iOS中苹果提供4钟方案来帮助我们实现多线程: (1) 纯C语言的pthread,偏底层,需要程序员手动管理线程的生命周期,基本不用. (2) OC语言的NSTr ...

  4. [转]关于GCD与多线程

    GCD是什么,你知道吗?你知道了GCD,你确定你会使用吗? 这一篇文章是站在初学者角度去分析GCD,原因是这个很多iOS开发者根本就没用过,即使用过,不知道其中的原理.讲解之前认识一下什么是线程,为什 ...

  5. IOS开发GCD小结

    0. Brief Introduction GCD,全称Grand Central Dispath,是苹果开发的一种支持并行操作的机制.它的主要部件是一个FIFO队列和一个线程池,前者用来添加任务,后 ...

  6. Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

    OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLin ...

  7. iOS 多线程之GCD的使用

    在iOS开发中,遇到耗时操作,我们经常用到多线程技术.Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法,只需定义想要执行的任务,然后添加到适当的调度队列 ...

  8. 【swift】BlockOperation和GCD实用代码块

    //BlockOperation // // ViewController.swift import UIKit class ViewController: UIViewController { @I ...

  9. 修改版: 小伙,多线程(GCD)看我就够了,骗你没好处!

    多线程(英语:multithreading),是指从软件或者硬件上实现多个线程并发执行的技术.具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能.具有这种能力的系 ...

随机推荐

  1. Centos 7.0 安装Mono 3.4 和 Jexus 5.6

    2013-07-26 写过一篇<CentOS 6.3下 安装 Mono 3.2 和Jexus 5.4>,CentOS 7在CentOS 6的基础上有很大的调整,本文是这篇文章的更新,主要介 ...

  2. 使用mapreduce计算环比的实例

    最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...

  3. The type javax.ws.rs.core.MediaType cannot be resolved. It is indirectly referenced from required .class files

    看到了http://stackoverflow.com/questions/5547162/eclipse-error-indirectly-referenced-from-required-clas ...

  4. 大数据之Oozie——源码分析(一)程序入口

    工作中发现在oozie中使用sqoop与在shell中直接调度sqoop性能上有很大的差异.为了更深入的探索其中的缘由,开始了oozie的源码分析之路.今天第一天阅读源码,由于没有编译成功,不能运行测 ...

  5. ScrollView嵌套ListView,GridView数据加载不全问题的解决

    我们大家都知道ListView,GridView加载数据项,如果数据项过多时,就会显示滚动条.ScrollView组件里面只能包含一个组件,当ScrollView里面嵌套listView,GridVi ...

  6. Nginx服务器之Nginx与tomcat结合访问jsp

    本文使用linux centos系统 本文概述: JSP是一种动态网页技术标准.使用的方式是在HTML文件中插入程序段和JSP标记,而形成JSP文件.使用JSP开发WEB应用可以跨平台开发.但jsp需 ...

  7. Swift3中函数的使用

    前言:前不久,Swift语言也更新到了3.0版本,对编程有一定基础的朋友一定不会对函数这个概念陌生.而Swift语言中的函数也是大同小异的,今天就跟着小编来学习一下Swift3中函数的不一样的用法. ...

  8. ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立

    系列目录 工作流在实际应用中还是比较广泛,网络中存在很多工作流的图形化插件,可以做到拉拽的工作流设计,非常简便,再配合第三方编辑器,可以直接生成表单,我没有刻意的浏览很多工作流的实际设计,我认为工作流 ...

  9. Encountered an unexpected error when attempting to resolve tag helper directive '@addTagHelper' with value '"*, Microsoft.AspNet.Mvc.TagHelpers"'

    project.json 配置: { "version": "1.0.0-*", "compilationOptions": { " ...

  10. 【分布式】Zookeeper的Leader选举

    一.前言 前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举. 二.Leader选举 2.1 Leader选举概 ...