标签:
GCD
目录
一。GCD概述
二。GCD的常规使用方法
三。GCD大杀器----异步下载图片并刷新UI。
四。GCD+Block
五一次性执行:
六延迟执行
七 dispatch_time_t与秒的对应关系
一。GCD概述
Grand宏大的 Central中央 Dispatch调度
是处理多线程的,类似于NSThread,但是比NSThread强大很多
架构核心是队列和执行方法,dispatch_queue_t和dispatch_async(或dispatch_sync,同步方法一般都不使用)
二。GCD的常规使用方法
GCD的使用有三种方法:
第一种:create一个串行分线程队列
//创建一个串行调度队列(这种方式不推荐使用,一般都是去获取而不是创建)
//第一个执行完之后才会执行下一个,如果第一个耗时较长,那么下一个需要等待
//第一个参数:唯一的一个标示符,是c的字符串
//第二个参数:是对这个队列的描述,直接写NULL
dispatch_queue_t queue = dispatch_queue_create("com.zhuoyouapp.agcd", NULL);
//同步执行,会处于等待状态,可能会卡死主线程
dispatch_sync(queue, ^{
//同步执行是在主线程中进行的
//NSLog(@"-----%d----", [NSThread isMainThread]);
});
//异步执行,立即返回,不会对主线程有影响
dispatch_async(queue, ^{
//NSLog(@"----2-----");
//[NSThread sleepForTimeInterval:5];
//NSLog(@"----3-----");
});
dispatch_async(queue, ^{
//[NSThread sleepForTimeInterval:5];
//串行队列的异步执行是在分线程中执行的
//NSLog(@"----%d-----", [NSThread isMainThread]);
});
dispatch_async(queue, ^{
//[NSThread sleepForTimeInterval:3];
//NSLog(@"----2-----");
});
dispatch_async(queue, ^{
//[NSThread sleepForTimeInterval:1];
//NSLog(@"----3-----");
});
第二种:获得一个并行分线程队列
//第一个参数:优先级,选默认即可
//第二个参数:标记,写0即可
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue2, ^{
//[NSThread sleepForTimeInterval:1];
//在分线程中完成,如果有大量数据需要下载,可以放在此处
//NSLog(@"----%d-----", [NSThread isMainThread]);
});
dispatch_async(queue2, ^{
//[NSThread sleepForTimeInterval:2];
//NSLog(@"----2-----");
});
dispatch_async(queue2, ^{
//[NSThread sleepForTimeInterval:3];
//NSLog(@"----3-----");
});
第三种:获取主线程队列
dispatch_queue_t queue3 = dispatch_get_main_queue();
dispatch_async(queue3, ^{
//主线程中执行,如果有刷新UI的操作,写在此处
NSLog(@"----%d-----", [NSThread isMainThread]);
});
dispatch_async(queue3, ^{
NSLog(@"----2-----");
});
dispatch_async(queue3, ^{
NSLog(@"----3-----");
});
三。GCD大杀器----异步下载图片并刷新UI。
//下载并刷新UI
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://百度的图片地址]];
UIImage *image = [UIImage imageWithData:data];
dispatch_async(dispatch_get_main_queue(), ^{
self.imageView.image = image;
});
});
四。GCD+Block
gcd中使用block会对没有__block修饰的局部变量,无论是基本数据类型还是对象指针还是形参,都会retain一次,执行完之后会自动release。
行完之后会释放其保留的那次引用计数
ZYTest *test = [[ZYTest alloc] init];
//NSLog(@"1--->%d", test.retainCount);
dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue4, ^{
//NSLog(@"2--->%d", test.retainCount);
//test.date = [NSDate date];
});
//[NSThread sleepForTimeInterval:1];
//NSLog(@"3--->%d", test.retainCount);
gcd中的block会对形参对象retain一次,无论原来这个形参是什么类型的(__block,局部,全局)
t = [[ZYTest alloc] init];
[self test:t];
[t release];
test方法的内容:
- (void)test:(ZYTest *)test
{
NSLog(@"1--->%d", test.retainCount);
dispatch_queue_t queue4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue4, ^{
NSLog(@"2--->%d", test.retainCount);
//test.date = [NSDate date];
});
[NSThread sleepForTimeInterval:1];
NSLog(@"3--->%d", test.retainCount);
}
五一次性执行:
// 一次性执行:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// code to be executed once
});
六延迟执行
// 延迟2秒执行:
double delayInSeconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
// code to be executed on the main queue after delay
});
七 dispatch_time_t与秒的对应关系
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 3 * NSEC_PER_SEC);
标签:
原文地址:http://www.cnblogs.com/MyHomesAdult/p/4959448.html