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 ...
随机推荐
- HBase概念学习(七)HBase与Mapreduce集成
这篇文章是看了HBase权威指南之后,依据上面的解说搬下来的样例,可是略微有些不一样. HBase与mapreduce的集成无非就是mapreduce作业以HBase表作为输入,或者作为输出,也或者作 ...
- ZOJ 3790 Consecutive Blocks 模拟题
problemCode=3790">Consecutive Blocks 先离散一下,然后模拟,把一种颜色i所在的位置都放入G[i]中.然后枚举一下终点位置,滑动窗体使得起点和终点间花 ...
- Swift初体验 (一)
// 声明一个常量 let maxNumberOfStudents: Int = 47 // 声明一个变量,假设没有在声明的时候初始化,须要显示的标注其类型 var currentNumberOfSt ...
- EasyUI - SearchBox 搜索框
效果: html代码: <input id="ss"/> <div id="mm"> <div data-options=&quo ...
- MFC模板CArray及其派生类
CArray及其派生类 1. 简介:访问方法及效率和普通的数组一样,比普通数组强大的功能是可以改变数组的大小.Array采用队列方式存储数据,因而其内部数据元素是以物理方式顺序排列的,所以检索.顺序执 ...
- HTTP协议和web工作原理
本章学完之后能干什么? 要把 知识点学好,那就需要把它相关的周边知识点了解全面 HTTP协议是web学习的核心!!! 学东东切忌只学配置,不学原理:只学会框架有什么用,要会自己写框架!! web学习直 ...
- hdu 4691 Front compression (后缀数组)
hdu 4691 Front compression 题意:很简单的,就是给一个字符串,然后给出n个区间,输出两个ans,一个是所有区间的长度和,另一个是区间i跟区间i-1的最长公共前缀的长度的数值的 ...
- entity framework 6 我写了一个公用数据类
public class BaseDAL { string strConn = ""; public BaseDAL(string connString) { strConn = ...
- ajax获取的全部是object,我要获取的是json
编程语言 ---------------------------------------------前台: $(document).ready(function() { var data= []; ...
- Java字符串找出4个字节长度的字符
不解释,直接上代码: 由于Iteye代码贴四个字节的UTF-8字符出错,特能图的方式发布几个特殊字符: public class Byte4Check { public static void m ...