GCD概述

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);

时间: 2024-12-08 13:35:36

GCD概述的相关文章

GCD 线程处理

GCD一.GCD概述二.GCD的常规使用方法三.GCD大杀器----异步下载图片并刷新UI.四.GCD+Block五一次性执行:六延迟执行七  dispatch_time_t与秒的对应关系一.GCD概述Grand宏大的 Central中央 Dispatch调度是处理多线程的,类似于NSThread,但是比NSThread强大很多架构核心是队列和执行方法,dispatch_queue_t和dispatch_async(或dispatch_sync,同步方法一般都不使用)二.GCD的常规使用方法GC

开发技术前线 第八期 周报

开发技术前线 第八期 周报 Android 领域 技术文章 Android 进行单元测试难在哪-序 自定义Drawables Support Libraries v22.1.0 检测Android应用的启动与关闭 开始学习Material-Design 如何在Android上响应各种信息通知 iOS 领域 技术文章 使用Swift自定义ViewController切换效果与动画 Swift样式指南:2015年4月更新 GCD概述.语法以及好的示例

转 GCD

GCD 深入理解:第一部分 本文翻译自 http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 原作者:Derek Selander 译者:@nixzhu 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两

GCD - 多线程

什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一个库,为并发代码在多核硬件(跑 iOS 或 OS X )上执行提供有力支持.它具有以下优点: 1.GCD 能通过推迟昂贵计算任务,并在后台运行它们改善应用的响应性能. 2.GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱. 3.GCD 具有在常见模式(例如单例),用更高性能的原语优化你的代码. GCD 术语 Serial vs. Concurrent 串

GCD技术小结

什么是 GCD GCD 是 libdispatch 的市场名称,而 libdispatch 作为 Apple 的一个库,为并发代码在多核硬件(跑 iOS 或 OS X )上执行提供有力支持.它具有以下优点: 1.GCD 能通过推迟昂贵计算任务并在后台运行它们来改善你的应用的响应性能. 2.GCD 提供一个易于使用的并发模型而不仅仅只是锁和线程,以帮助我们避开并发陷阱. 3.GCD 具有在常见模式(例如单例)上用更高性能的原语去优化你的代码的潜在能力. GCD 术语 Serial vs. Conc

GCD 深入理解:第二部分

在本系列的第一部分中,你已经学到超过你想像的关于并发.线程以及GCD 如何工作的知识.通过在初始化时利用 dispatch_once,你创建了一个线程安全的 PhotoManager 单例,而且你通过使用 dispatch_barrier_async 和 dispatch_sync 的组合使得对 Photos 数组的读取和写入都变得线程安全了. 除了上面这些,你还通过利用 dispatch_after 来延迟显示提示信息,以及利用 dispatch_async 将 CPU 密集型任务从 View

GCD 深入理解(一)

本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示.在第二部分

GCD的深入理解

GCD 深入理解(一) 本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找

GCD 深入理解(二)

转自@nixzhu的GitHub主页(译者:Riven.@nixzhu),原文<Grand Central Dispatch In-Depth: Part 2/2> 欢迎来到GCD深入理解系列教程的第二部分(也是最后一部分). 在本系列的第一部分中,你已经学到超过你想像的关于并发.线程以及GCD 如何工作的知识.通过在初始化时利用 dispatch_once,你创建了一个线程安全的 PhotoManager 单例,而且你通过使用 dispatch_barrier_async 和 dispatc