IOS GCD 简介
2014-08-24 22:03
246 查看
1.基本介绍:
(1) Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。
(2) GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。
(3) 它是IOS多线程抽象层次最高的一层,下面还有前面2章节介绍的更加轻量级的Cocoa operations,和Thread。
2.主要方法:
(1)创建一个队列
dispatch_queue_t queue = dispatch_queue_create("LoadImage", NULL);
其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL)。
(2)执行一个队列(async--->异步,sync--->同步)
dispatch_async(queue, ^{ [self doSomething]; });
其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
(3)声明并执行一个队列 (如果不需要保留要运行的队列的引用)
dispatch_async(dispatch_queue_create ("LoadImage", NULL), ^{ [self doSomething]; });
(4)暂停一个队列
dispatch_suspend(queue);
(5)恢复一个队列(如果暂停一个队列不要忘记恢复)
dispatch_resume(queue);
(6)将代码块中的工作转回到主线程(注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用)
dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });
3.代码示例
[objc] view
plaincopy
#pragma mark - GCD(Grand Central Dispatch)
- (void)GCD{
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
// 多一个a,异步
dispatch_async(queue, ^{
for (int i = 0; i < 100; i++) {
NSLog(@"--多线程--%d",i);
}
// 判断是否是在多线程运行环境
BOOL isMulti = [NSThread isMultiThreaded];
NSLog(@"%d",isMulti);
if (isMulti) {
NSLog(@"*********多线程***********");
}
// 将代码块中的工作转回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
// 判断是否是在主线程运行环境
BOOL isMain = [NSThread isMainThread];
if (isMain) {
NSLog(@"*********主线程**********");
}
});
});
/* // 通过此方式,还是运行在当前线程
dispatch_sync(queue, ^{
// 主线程
});
*/
for (int i = 0; i < 100; i++) {
NSLog(@"--主线程--%d",i);
}
}
4.加载网络图片(在多线程加载明显比放在主线程加载快N多)
[objc] view
plaincopy
#pragma mark - 给UIImageView写一个类目
@interface UIImageView (WebCach)
- (void)setImageWithURL:(NSURL *)url;
@end
#import "UIImageView+WebCach.h"
@implementation UIImageView (WebCach)
- (void)setImageWithURL:(NSURL *)url{
dispatch_queue_t queue = dispatch_queue_create("loadImage", NULL);
dispatch_async(queue, ^{
NSData * data = [NSData dataWithContentsOfURL:url];
UIImage * image = [UIImage imageWithData:data];
// 加载UI的操作,一般放在主线程进行
dispatch_async(dispatch_get_main_queue(), ^{
self.image = image;
});
});
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.gif"]];
[self.view addSubview:imageView];
}
(1) Grand Central Dispatch (GCD)是Apple开发的一个多核编程的较新的解决方法。在Mac OS X 10.6雪豹中首次推出,并在最近引入到了iOS4.0。
(2) GCD是一个替代诸如NSThread等技术的很高效和强大的技术。GCD完全可以处理诸如数据锁定和资源泄漏等复杂的异步编程问题。
(3) 它是IOS多线程抽象层次最高的一层,下面还有前面2章节介绍的更加轻量级的Cocoa operations,和Thread。
2.主要方法:
(1)创建一个队列
dispatch_queue_t queue = dispatch_queue_create("LoadImage", NULL);
其中,第一个参数是标识队列的,第二个参数是用来定义队列的参数(目前不支持,因此传入NULL)。
(2)执行一个队列(async--->异步,sync--->同步)
dispatch_async(queue, ^{ [self doSomething]; });
其中,首先传入之前创建的队列,然后提供由队列运行的代码块。
(3)声明并执行一个队列 (如果不需要保留要运行的队列的引用)
dispatch_async(dispatch_queue_create ("LoadImage", NULL), ^{ [self doSomething]; });
(4)暂停一个队列
dispatch_suspend(queue);
(5)恢复一个队列(如果暂停一个队列不要忘记恢复)
dispatch_resume(queue);
(6)将代码块中的工作转回到主线程(注意,dispatch_suspend (以及dispatch_resume)在主线程上不起作用)
dispatch_sync(dispatch_get_main_queue(), ^{ [self dismissLoginWindow]; });
3.代码示例
[objc] view
plaincopy
#pragma mark - GCD(Grand Central Dispatch)
- (void)GCD{
dispatch_queue_t queue = dispatch_queue_create("test", NULL);
// 多一个a,异步
dispatch_async(queue, ^{
for (int i = 0; i < 100; i++) {
NSLog(@"--多线程--%d",i);
}
// 判断是否是在多线程运行环境
BOOL isMulti = [NSThread isMultiThreaded];
NSLog(@"%d",isMulti);
if (isMulti) {
NSLog(@"*********多线程***********");
}
// 将代码块中的工作转回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
// 判断是否是在主线程运行环境
BOOL isMain = [NSThread isMainThread];
if (isMain) {
NSLog(@"*********主线程**********");
}
});
});
/* // 通过此方式,还是运行在当前线程
dispatch_sync(queue, ^{
// 主线程
});
*/
for (int i = 0; i < 100; i++) {
NSLog(@"--主线程--%d",i);
}
}
4.加载网络图片(在多线程加载明显比放在主线程加载快N多)
[objc] view
plaincopy
#pragma mark - 给UIImageView写一个类目
@interface UIImageView (WebCach)
- (void)setImageWithURL:(NSURL *)url;
@end
#import "UIImageView+WebCach.h"
@implementation UIImageView (WebCach)
- (void)setImageWithURL:(NSURL *)url{
dispatch_queue_t queue = dispatch_queue_create("loadImage", NULL);
dispatch_async(queue, ^{
NSData * data = [NSData dataWithContentsOfURL:url];
UIImage * image = [UIImage imageWithData:data];
// 加载UI的操作,一般放在主线程进行
dispatch_async(dispatch_get_main_queue(), ^{
self.image = image;
});
});
}
@end
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
UIImageView * imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
[imageView setImageWithURL:[NSURL URLWithString:@"http://www.baidu.com/img/bdlogo.gif"]];
[self.view addSubview:imageView];
}
相关文章推荐
- iOS多线程GCD简介(二)
- iOS开发多线程篇—GCD简介
- IOS GCD 使用(一) 简介
- ios学习笔记——GCD简介
- iOS多线程GCD简介(二)
- iOS 多线程GCD简介
- iOS多线程GCD简介(一)
- iOS多线程编程及GCD简介
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- IOS开发之Quart绘图方法简介
- IOS多线程开发之GCD
- iOS 的 ASIHTTPRequest 类库简介和使用说明
- IOS开发之程序首次启动时加载关于程序应用的简介
- iphone ios Quartz 2d简介,教程
- ios数据管理简介
- OpenEars iOS 开源项目 简介
- ios数据管理简介
- iOS gcd
- iOS中GCD的魔力
- IOS 利用多核运算-GCD开发