GCD的其他方法
1.栅栏函数
作用:控制线程的执行顺序
注:栅栏函数不能使用全局并发队列
-(void)barrier
{
//1.创建队列(并发队列)
dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ for (NSInteger i = ; i<; i++) {
NSLog(@"%zd-download1--%@",i,[NSThread currentThread]);
}
}); dispatch_async(queue, ^{ for (NSInteger i = ; i<; i++) {
NSLog(@"%zd-download2--%@",i,[NSThread currentThread]);
}
}); //栅栏函数
dispatch_barrier_async(queue, ^{
NSLog(@"我是一个栅栏函数");
}); dispatch_async(queue, ^{ for (NSInteger i = ; i<; i++) {
NSLog(@"%zd-download3--%@",i,[NSThread currentThread]);
}
}); dispatch_async(queue, ^{ for (NSInteger i = ; i<; i++) {
NSLog(@"%zd-download4--%@",i,[NSThread currentThread]);
}
});
}
栅栏函数
2.延迟执行
-(void)delay
{
NSLog(@"----");
//表名2秒钟之后调用run
// [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(run) userInfo:nil repeats:YES]; /*
第一个参数:延迟时间
第二个参数:要执行的代码
*/
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_global_queue(, ), ^{
NSLog(@"---%@",[NSThread currentThread]);
}); }
延迟执行
3.一次性代码
程序运行过程中只执行一次,执行一次后永远都不执行
-(void)once
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"+++++++++");
});
}
一次性代码
4.快速迭代
-(void)applay
{
// for (NSInteger i=0; i<10; i++) {
// NSLog(@"%zd--%@",i,[NSThread currentThread]);
// } //创建队列(并发队列)
dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
/*
第一个参数:迭代的次数
第二个参数:在哪个队列中执行
第三个参数:block要执行的任务
*/
dispatch_apply(, queue, ^(size_t index) {
NSLog(@"%zd--%@",index,[NSThread currentThread]);
});
}
快速迭代
//文件在哪个地方(文件夹)
NSString *form = @"/Users/xiaomage/Desktop/form";
//要剪切到什么地方
NSString *to = @"/Users/xiaomage/Desktop/to";
NSFileManager *manager = [NSFileManager defaultManager];
//获取文件夹下子文件/子文件夹的路径
//可以获取到子文件和子文件夹的路径
NSArray *subpaths = [manager subpathsAtPath:form];
// 可以获取到子文件和子文件夹的路径
NSDirectoryEnumerator *enumer = [manager enumeratorAtPath:to];
//只能获取子文件的路径
NSDirectoryEnumerator *enumer = [manager directoryContentsAtPath:form];
//创建队列(并发队列)
dispatch_queue_t queue = dispatch_queue_create("com.downloadqueue", DISPATCH_QUEUE_CONCURRENT);
NSInteger count = [subpaths count];
dispatch_apply(count, queue, ^(size_t index) {
NSString *subpath = subpaths[index];
NSString *fullPath = [form stringByAppendingPathComponent:subpath];
//拼接目标文件全路径
NSString *fileName = [to stringByAppendingPathComponent:subpath];
//剪切操作
[manager moveItemAtPath:fullPath toPath:fileName error:nil];
NSLog(@"%@",[NSThread currentThread]);
});
用快速迭代实现文件夹内容的转移
5.队列组
有这么1种需求
首先:分别异步执行2个耗时的操作
-(void)group
{
//下载图片1 //创建队列组
dispatch_group_t group = dispatch_group_create(); //1.开子线程下载图片
//创建队列(并发)
dispatch_queue_t queue = dispatch_get_global_queue(, ); dispatch_group_async(group, queue, ^{
//1.获取url地址
NSURL *url = [NSURL URLWithString:@"http://www.huabian.com/uploadfile/2015/0914/20150914014032274.jpg"]; //2.下载图片
NSData *data = [NSData dataWithContentsOfURL:url]; //3.把二进制数据转换成图片
self.image1 = [UIImage imageWithData:data]; NSLog(@"1---%@",self.image1);
}); //下载图片2
dispatch_group_async(group, queue, ^{
//1.获取url地址
NSURL *url = [NSURL URLWithString:@"http://img1.3lian.com/img2011/w12/1202/19/d/88.jpg"]; //2.下载图片
NSData *data = [NSData dataWithContentsOfURL:url]; //3.把二进制数据转换成图片
self.image2 = [UIImage imageWithData:data];
NSLog(@"2---%@",self.image2); }); //合成
dispatch_group_notify(group, queue, ^{ //开启图形上下文
UIGraphicsBeginImageContext(CGSizeMake(, )); //画1
[self.image1 drawInRect:CGRectMake(, , , )]; //画2
[self.image2 drawInRect:CGRectMake(, , , )]; //根据图形上下文拿到图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); //关闭上下文
UIGraphicsEndImageContext(); dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
NSLog(@"%@--刷新UI",[NSThread currentThread]);
});
});
}
用队列组合成网络上的两个图片
GCD的其他方法的更多相关文章
- GCD部分使用方法
1,用gcd延迟运行任务 假设我们须要某个方法在一段时间后运行.那么我们经常会调用这个方案 - (void)viewDidLoad{ [super viewDidLoad]; [self perfor ...
- 网络与多线程---OC中多线程方法GCD(二)
小编在前一篇中介绍了多线程实现的五种常用方法.在接下来所介绍的这种方法是最具有魅力的,最具有诱惑的实现多线程的方案---GCD 一.什么是GCD GCD是Grand Central Dispatch的 ...
- GCD in Swfit 3.0
这里包括了Queue, Group, Barrier, Semaphore等内容.基本上常用的GCD对象和方法在Swift3.0的改变都囊括其中. 代码在这里:https://github.com/f ...
- GCD与block
GCD技术多线程编程的三个技术 NSThread NSOperation GCD1.GCD(Grand central Dispatch:宏大的中央调度) 1) 是用纯C语言实现的.提 ...
- iOS边练边学--GCD的基本使用、GCD各种队列、GCD线程间通信、GCD常用函数、GCD迭代以及GCD队列组
一.GCD的基本使用 <1>GCD简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 G ...
- IOS GCD使用实例大全
GCD是大家在IOS开发过程中经常使用的一种多线程管理机制.原理这里就不多说了,大家关心的大部分都是它的使用,下面主要介绍GCD的主要方法及其实例. 1.认识主队列,感受串行队列的运行,运行结果打印的 ...
- iOS多线程GCD的使用
1. GCD 简介 Grand Central Dispatch(GCD)是异步执行任务的技术之一.一般将应用程序中记述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到适当的Di ...
- GCD(III)
GCD 线程间的通信 在iOS开发过程中,我们一般在主线程里边进行UI刷新,例如:点击.滚动.拖拽等事件.我们通常把一些耗时的操作放在其他线程,比如说图片下载.文件上传等耗时操作.而当我们有时候在其他 ...
- iOS 多线程:『GCD』详尽总结
本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 ...
随机推荐
- JFrame中setDefaultCloseOperation的参数含义
实例1:一个空的java窗口 // JFrameDemo1.java import javax.swing.*; //使用Swing类,必须引入Swing包 public class JFra ...
- Response.Clear()和Response.ClearContent()区别
Response.Clear()方法 Clear方法删除所有缓存中的HTML输出.但此方法只删除Response显示输入信息,不删除Response头信息. Response.ClearContent ...
- [Machine-Learning] 熟悉 Numpy
Numpy 是 Python 中的一个模块,主要用于处理数学和计算相关的问题,这里是一个入门的介绍. 导入 习惯上可以这样导入: import numpy as np 在 machine learni ...
- linux-ubuntu常用命令
常用命令 cd 目录 #跳转到指定目录 cp fileName pfileName #拷贝fileName到pfilename ll #显示目录下的所有文件和目录 uname -a #查看内核版本 c ...
- [问题2014A11] 复旦高等代数 I(14级)每周一题(第十三教学周)
[问题2014A11] 设 \(n\) 阶方阵 \(A,B\) 满足: \((A+B)^2=A+B\), \(\mathrm{r}(A+B)=\mathrm{r}(A)+\mathrm{r}(B)\ ...
- 制作登录界面,登录成功后把用户名放在session里,在第3个页面读取session显示用户名
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- 关于Java项目打包
可以选择以下几种办法: 一.使用Eclipse,右键项目导出jar. 二.使用Eclipse,右键项目导出runnable jar. 三.使用Eclipse 插件fat jar,导出可执行的jar包. ...
- Json不知道key值情况下获取第一个键值对
JObject jsonData = new JObject(); jsonData.Add("1", "1"); jsonData.Add("2&q ...
- css取消input、select默认样式(手机端)
IOS端: background-color:transparent; border-color:transparent; andorid端: 仅仅使用上面的代码还不够,可以发现select框在某些浏 ...
- px和em的区别(转)
在国内网站中,包括三大门户,以及“引领”中国网站设计潮流的蓝色理想,ChinaUI等都是使用了px作为字体单位.只有百度好歹做了个可调的表率.而 在大洋彼岸,几乎所有的主流站点都使用em作为字体单位, ...