IOS线程操作(3)
采用CGD更有效的比前两个(它被认为是如此,有兴趣的同学可以去试试)。
这是推荐的方式来使用苹果的比较。
GCD它是Grand Central Dispatch缩写,这是一组并行编程C介面。
GCD是基于Objective-C的Block的特性开发的,主要的业务逻辑和NSOperation非常像。都是加入一个任务到一个队列,由系统来负责线程的生成和调度。由于直接使用Block。所以使用起来非常是方便。减少了多线程开发的门槛.
还是前两节下载图片的样例,让我们看一下使用GCD模式该如何做。
#import "ViewController.h"
#define IMAGE_PATH @"https://www.baidu.com/img/bdlogo.png"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *mImage;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:IMAGE_PATH]];
UIImage *image = [[UIImage alloc] initWithData:imageData];
//回到主线程
dispatch_async(dispatch_get_main_queue(), ^{
[self.mImage setImage:image];
});
});
}
是不是要简洁得多,GCD会自己主动帮我们创建消息队列。不须要我们再去手动创建和管理。
系统给每个应用程序提供了三个concurrent dispatch queues。
这三个并发调度队列是全局的,它们仅仅有优先级的不同。由于是全局的,我们不须要去创建。我们仅仅须要通过使用函数dispath_get_global_queue去得到队列,例如以下:
dispatch_queue_t globalQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
2、关于dispatch_group_async的使用
dispatch_group_async能够实现监听一组任务是否完毕,完毕后得到通知运行其它的操作。
这种方法非常实用,比方你运行三个下载任务,当三个任务都下载完毕后你才通知界面说完毕的了。以下是一段样例代码:
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, queue,^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"1.0");
});
dispatch_group_async(group, queue,^{
[NSThread sleepForTimeInterval:2.0];
NSLog(@"2.0");
});
dispatch_group_async(group, queue,^{
[NSThread sleepForTimeInterval:3.0];
NSLog(@"3.0");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"dispatch_group_async");
});
打印结果:
2015-06-03 12:42:46.673 IOS多线程[1706:138779] 1.0
2015-06-03 12:42:47.671 IOS多线程[1706:138782] 2.0
2015-06-03 12:42:48.672 IOS多线程[1706:138787] 3.0
2015-06-03 12:42:48.672 IOS多线程[1706:138679] dispatch_group_async
3、dispatch_barrier_async
我们能够通过
dispatch_queue_t queue = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr)
方法来生成自己定义的queue ,label參数。理论上是能够使用不论什么自己定义值的。我们一般使用倒序的程序路径名。
看以下的代码:
dispatch_queue_t queue = dispatch_queue_create("asd", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"1");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:4];
NSLog(@"2");
});
dispatch_barrier_async(queue, ^{
NSLog(@"3");
});
dispatch_async(queue, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"4");
});
打印结果:
2015-06-03 13:05:37.753 IOS多线程[1989:151430] 1
2015-06-03 13:05:41.757 IOS多线程[1989:151430] 2
2015-06-03 13:05:45.763 IOS多线程[1989:151430] 3
2015-06-03 13:05:46.764 IOS多线程[1989:151430] 4
大家能够看到 打印结果是依照顺序去打印的。也就是说这是在子线程中去进行的一个串行操作。dispatch_barrier_async是在前面的任务运行结束后它才运行,并且它后面的任务等它运行完毕之后才会运行
版权声明:本文博主原创文章,博客,未经同意不得转载。
IOS线程操作(3)的更多相关文章
- iOS 线程操作库 PromiseKit
iOS 线程操作库 PromiseKit 官网:http://promisekit.org/ github:https://github.com/mxcl/PromiseKit/tree/master ...
- iOS子线程操作UI问题检查
iOS开发中,因为大部分函数都不是线程安全的,所以UI子线程中操作UI是非常危险的事,但是有时候因为开发者经验不足,不知道子线程中不能UI,或者知道但是写代码的时候没注意,或者不知道那些函数操作UI了 ...
- iOS子线程操作检测版本更新,有新版本通知用户更新, CheckVersion
iOS子线程操作检测版本更新,有新版本通知用户更新 CheckVersion 一:如何使用: #import "CheckVersion.h" //输入你的app在appStore ...
- iOS 数据库操作(使用FMDB)
iOS 数据库操作(使用FMDB) iOS中原生的SQLite API在使用上相当不友好,在使用时,非常不便.于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.Plausibl ...
- iOS线程开发小结
在iOS开发线程操作时,一般方法名决定是否开启新线程(async,sync),队列类型(全局队列,串行队列)决定开启多少条线程 1.快速线程调用 *开启后台线程执行任务 [self performSe ...
- iOS线程之——NSCondition
多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线 ...
- winform 跨线程操作控件
当进行winform的开发时,经常遇到用时比较久的操作,在传统的单线程程序中,用户必须等待这个耗时操作完成以后才能进行下一步的操作,这个时候,多线程编程就派上用场了,将这个耗时的操作放到一个新的子线程 ...
- 扩展BindingList,防止增加、删除项时自动更新界面而不出现“跨线程操作界面控件 corss thread operation”异常
在做界面程序时,常常需要一些数据类,界面元素通过绑定等方式显示出数据,然而由于UI线程不是线程安全的,一般都需要通过Invoke等方式来调用界面控件.但对于数据绑定bindingList而言,没法响应 ...
- IOS 线程处理 子线程
IOS 线程处理 子线程的启动与结束 技术交流新QQ群:414971585 IOS中,如果要在主线程中启动一个子线程,可以又两种方法: [NSThread detachNewThreadSelec ...
随机推荐
- Java中二进制、十进制、十六进制及ASCII码与String及字节数组与十六进制之间的转换
public class DigitalTrans { /** * 数字字符串转ASCII码字符串 * * @param String * 字符串 * @return ASCII字符串 */ publ ...
- java-多线程安全问题
1. 安全问题产生原因 多个线程操作共享数据. 操作共享数据的线程代码有多条.当一个线程在执行操作共享数据的多条代码过程中,其他线程参与了计算,就会产生线程安全问题. 2. 解决方案 java中用同步 ...
- C#、ASP.NET、WinForm - 实现邮件发送的功能
转载自:http://www.cnblogs.com/mingmingruyuedlut/archive/2011/10/14/2212255.html 发送邮件所用的核心知识点 微软封装好的Mail ...
- 将258.369 double值转为内存表示(科学计数法)
前言 庖丁解牛 - <<庄子>> 庖丁为文惠君解牛,手之所触, 肩之所倚, 足之所履, 膝之所踦, 砉然向然, 奏刀騞然, 莫不中音, 合于<桑林>之舞, 乃中&l ...
- 【水】HDU 2099——整除的尾数
来源:点击打开链接 数据范围小,枚举水过就行了……不过要注意格式! #include <iostream> #include <cstring> #include <io ...
- PHP之操作数据库
数据库,顾名思义,是一个存放数据的容器.然后在使用过程中对数据库里面的数据增删改查,具体是怎么实现的呢? 这儿不得不提一下一个神奇的东西:SQL语句:结构化查询语言(Structured Query ...
- Qt4创建工程的几种方法:linux系统
方法一:以Qt Creator 作为IDE 1.启动Qt Creator,并创建一个空项目 2.输入路径和工程名字 3.添加cpp文件 4.添加代码,并且编译执行 5.执行结果 方法二:利用linux ...
- NYOJ 1085 数单词 (AC自己主动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 为了可以顺利通过英语四六级考试,如今大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中能够通过六 ...
- QEventLoop等待另外一个事件的停止,非常实用 good
void MyWidget::SendRequest(QString strUser) { network_manager = new QNetworkAccessManager(); connect ...
- POJ 2184 Cow Exhibition 01背包
题意就是给出n对数 每对xi, yi 的值范围是-1000到1000 然后让你从中取若干对 使得sum(x[k]+y[k]) 最大并且非负 且 sum(x[k]) >= 0 sum(y[k] ...