[New learn]GCD其他方法的使用
https://github.com/xufeng79x/GCDDemo
1.简介
在前面的两篇博文中我介绍了GCD的一般使用方法和死锁的分析调查。本博文中继续讲解GCD的其他比较常用的几个使用方法。
2.线程间的通信
线程间通信意指如何在当前线程中去通知或者去调度其他线程完成任务。
比较经典的一个用例为将耗时操作放在某个线程中(非主队列任务)然后完成后去更新控件(主队列任务)。
-(void)loadImage
{
dispatch_async(dispatch_get_global_queue(, ), ^{
// 1. 网络上图片的URL
NSURL *url = [NSURL URLWithString:@"http://att2.citysbs.com/hangzhou/image1/2010/06/28-14/middle_20100628_479774d896cf207fed251P3nfB3V8Pmp.jpg"];
// 2. 获取网络图片数据,二进制
NSData *data = [NSData dataWithContentsOfURL:url];
// 3. 二进制数据转换成图片
UIImage *image = [UIImage imageWithData:data];
// 4.通知主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.image.image = image;
});
});
}
如果你自己测试代码测试那么需要在工程的info.plist中进行如下设定,增加如下选项:

3.延迟执行
-(void) delayExecute
{
// 延迟时间
dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)( * NSEC_PER_SEC));
NSLog(@"start at %@", [NSDate new]);
// 指定队列,延迟指定时间后执行任务
dispatch_after(when, dispatch_get_global_queue(, ), ^{
NSLog(@"end at %@", [NSDate new]);
NSLog(@"%@", [NSThread currentThread]);
});
}
结果:
-- :::] start at -- :: + -- :::] end at -- :: + -- :::] <NSThread: , name = (null)}
4.调度组
调度组的应用场景:
开发的时候有的时候出现多个网络请求,在多个网络请求全部结束后统一去触发某个处理(更新UI通知用户等)。
比如下载多部小说后通知用户小说已经全部下载完毕了。
基本步骤如下:
-(void) group
{
// 实例化一个调度组
dispatch_group_t group = dispatch_group_create();
// 创建或者获取队列
dispatch_queue_t queue1 = dispatch_get_global_queue(, );
// 将任务放入队列,包进到指定group
dispatch_group_async(group, queue1, ^{
NSLog(@"下载小说A----%@", [NSThread currentThread]);
});
// 创建或者获取队列
dispatch_queue_t queue2 = dispatch_queue_create("xf", DISPATCH_QUEUE_CONCURRENT);
dispatch_group_async(group, queue2, ^{
NSLog(@"下载小说B----%@", [NSThread currentThread]);
});
// 创建或者获取队列
dispatch_queue_t queue3 = dispatch_queue_create("xf", DISPATCH_QUEUE_SERIAL);
dispatch_group_async(group, queue3, ^{
NSLog(@"下载小说C----%@", [NSThread currentThread]);
});
// 创建或者获取队列
dispatch_queue_t queue4 = dispatch_get_main_queue();
dispatch_group_notify(group, queue4, ^{
NSLog(@"下载完成,请观看----%@", [NSThread currentThread]);
});
}
结果:
-- :::] 下载小说B----<NSThread: , name = (null)} -- :::] 下载小说A----<NSThread: , name = (null)} -- :::] 下载小说C----<NSThread: , name = (null)} -- :::] 下载完成,请观看----<NSThread: , name = main}
总结:
可以看到,放入group的任务可以在不同的队列中,group能够统一的感知到所有任务是否全部完成。
5.一次性执行
-(void)once
{
static dispatch_once_t onceToken;
NSLog(@"out onceToken is %ld", onceToken);
dispatch_once(&onceToken, ^{
NSLog(@"in onceToken is %ld", onceToken);
NSLog(@"执行了一次!");
});
NSLog(@"完成");
}
结果:
-- :::] -- :::] -- :::] 执行了一次! -- :::] 完成 -- :::] -- :::] 完成 -- :::] -- :::] 完成
总结:
即使我们多次点击屏幕,“执行一次!”这段log也只会出书一次,换句话说,任务只被执行一次。
其实这段代码是通过onceToken这个静态数据来判断任务是否已经被执行了,当判断为-1时候认为任务已经被执行了。
如果我们一开始就初始化onceToken为-1,其实程序就一次也不会做任务了。不信试一试。
场景:
我们可以将这个特性应用于单例的创建。
[New learn]GCD其他方法的使用的更多相关文章
- [New learn]GCD的卡死现象分析研究
https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...
- [New learn]GCD的基本使用
https://github.com/xufeng79x/GCDDemo 1.简介 介绍GCD的使用,介绍多种队列与同步异步多种情况下的组合运行情况. 2.基本使用步骤 如果使用GCD则一般也就两个步 ...
- iOS 线程之GCD的高级使用方法
之前的一篇关于线程的blog已经为大家介绍了GCD的简单使用方式及样例说明,今天因为项目中有特殊的应用GCD的实例,为大家介绍两种特殊需求的使用GCD的方法. 目的:实现一件事情做完,再做下一件事情. ...
- GCD中的dispatch_group函数的详解
<一>引入dispatch_group函数的目的 在追加到dispatch_Queue中的多个处理全部结束后想要执行结束的处理,这种需求经常会在我们的程序中出现 (第一种情况)只使用一个S ...
- Operation与GCD的不同
最大并发数: 什么是并发数? 同时执行的任务数.比如同时开启三个线程执行三个任务,并发数就是3. 最大并发数相关的方法: -(NSInteger)maxConcurrentOperationCount ...
- iOS开发中GCD在多线程方面的理解
GCD为Grand Central Dispatch的缩写. Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法.在Mac OS X 10.6雪豹中 ...
- 【转】MegaSAS RAID卡 BBU Learn Cycle周期的影响
http://ju.outofmemory.cn/entry/140 背景 最近遇到有些带MegaSAS RAID卡的服务器,在业务高峰时突然IO负载飚升得很高,IO性能急剧下降,查了日志及各种设置最 ...
- 选择 GCD 还是 NSTimer ?
我们常常会延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. 延迟操作的方案一般有三种: 1.NSObject的方法: 2.使用NSTimer的方法: 3 ...
- iOS多线程开发--NSThread NSOperation GCD
多线程 当用户播放音频.下载资源.进行图像处理时往往希望做这些事情的时候其他操作不会被中 断或者希望这些操作过程中更加顺畅.在单线程中一个线程只能做一件事情,一件事情处理不完另一件事就不能开始,这样势 ...
随机推荐
- 【刷题】UOJ #34 多项式乘法
这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入格式 第一行两个整数 \(n\) 和 \(m\) ,分别表示两个多项式的次数. 第二行 \(n+1\) 个整数,表示第一个多项式的 \( ...
- [洛谷P3979]遥远的国度
题目大意:有一棵$n$个点的树,每个点有一个点权,有三种操作: $1\;x:$把根变成$x$ $2\;u\;v\;x:$把路径$u->v$上的点权改为$x$ $3\;x:$询问以$x$为根的子树 ...
- 51NOD 1594:Gcd and Phi——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1594 参考及详细推导:http://www.cnblogs.com/ri ...
- LOJ6342::跳一跳——题解
https://loj.ac/problem/6342 f[i]表示从i开始跳的期望时间,f[n]=0. 所以f[i]=(f[i]+f[i+1]+……+f[n])/(n-i+1)+1. 移项整理可求f ...
- STL之五:set/multiset用法详解
集合 转载于:http://blog.csdn.net/longshengguoji/article/details/8546286 使用set或multiset之前,必须加入头文件<set&g ...
- android xml字符串通配
1.基本使用方法 xml中定义如下字符串: <string name="buff">%1$d --- %2$s</string> 代码中解析: String ...
- Sublime Text3 安装Markdown
Sublime Text3是一款给力的文本编辑器,通过安装插件可以编辑Markdown文本,在编辑Markdown文本的同时可以实时预览编辑效果. 安装准备: 找到菜单栏:Preferences → ...
- [技巧篇]16.MyEclipse2014安装SVN插件,在线安装
这两天想做点东西,但是现在流行的是git,但是军哥的项目是托管到阿里的svn代码当中,所以没有办法,还需要弄SVN,这里不将什么安装SVN等东西 我要求的就是快速入门而已,仅此而已,我安装成功,过程很 ...
- UVA 808 Bee Breeding (坐标法)
https://vjudge.net/problem/UVA-808 #include<cmath> #include<cstdio> #include<algorith ...
- 动态规划:区间DP与环形DP
区间型动态规划的典型例题是石子归并,同时使用记忆化搜索实现区间动归是一种比较容易实现的方式,避免了循环数组实现的时候一些边界的判断 n堆石子排列成一条线,我们可以将相邻的两堆石子进行合并,合并之后需要 ...