文档章节

GCD队列

iossocket
 iossocket
发布于 2015/06/21 11:00
字数 992
阅读 67
收藏 0

Queues队列

    GCD提供了dispatch queues来处理我们提交给该该队列的任务,并使用了FIFO(先进先出)的方式来处理任务,可使第一个提交的任务第一个开始执行,第二个提交的任务,第二个开始执行,以此类推。串行和并发都是如此。

    队列可被分为串行队列和并发队列。其中串行队列,一次只执行一个任务,当此任务完成时,开始执行下一个任务;而并发队列,可实现多个任务同时在执行(此行为的实现方式也取决于CPU核数,对于单核CPU则是通过时间片的方式切换执行多任务)。

队列类型

    系统为我们提供了两种队列。其一,主队列,这是一种特殊的串行队列,此队列的任务均执行在主线程上,而主线程是唯一可更新UI的线程;其二,全局队列,它又可又优先级(backgroud、low、default、hight)的不同分为4种队列。系统也会使用这些队列,因此这些队列中也将会存在系统任务。

    另外,我们可以使用自定义队列,如何选择何时应选用这三种队列呢?

    主队列:当我们需要更新UI时,只能选用主队列。

    并发队列:当我们需要在后台执行一些和UI无关的工作时。 参考如下代码:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // do something which do not relate to UI
    dispatch_async(dispatch_get_main_queue(), ^{
        // do something related to UI
    });
});

    自定义队列:当我们想在后台执行一系列工作,并想要跟踪这些工作的状态时,应选用自定义串行队列,它可以有效避免资源争用。创建自定义队列时使用方法dispatch_queue_create方法,第一个参数为一个字符串,对该队列进行标示,第二个参数为该队列的类型可以指定为串行队列DISPATCH_QUEUE_SERIAL,或并发队列DISPATCH_QUEUE_CONCURRENT。当设置为NULL时默认为串行队列。

dispatch_queue_t myQueue = dispatch_queue_create("com.iossocket", NULL);

dispatch_async(myQueue, ^{
    // do something
})

dispatch_release(myQueue);

在我们创建队列时,为队列起一个具有标示意义的标签,可以方便我们的调试。

当iOS版本低于6.0时,需要自己管理GCD对象。当高于6.0时ARC已经替我们管理了GCD对象,无需手动release它。


dispatch方法

1. 异步后台执行异步队列

dispatch_async(dispatch_get_global_queue(0,0), ^{
    // do sth...
});

2. 异步执行UI操作

dispatch_async(dispatch_get_main_queue(), ^{
    // do sth...
});

3. 执行一次性任务,可在创建单例时使用。

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    // this code just be executed once...
});

    当在单例中使用时:(要onceToken设置为static,或具有全局作用域)

+ (instancetype)single { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
        single = [[MySingle alloc] init]; 
    }); 
    return single; 
}

4. 延时执行

double delayTime = 3.0;
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, delayTime * NSEC_PER_SEC);
dispatch_after(delay, dispatch_get_main_queue(), ^{
   // after 3 seconds, these code will be executed...
});

5. 重复任务

dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
    sleep(5);
    NSLog(@"no..%zu", index);
});

使用dispatch_apply提交的任务,将阻塞主线程,既是被提交到全局并发队列中,通过上述代码的sleep(5)中可以发现。可通过如下方式来避免阻塞主线程:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    dispatch_apply(3, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(size_t index) {
        sleep(5);
        NSLog(@"no..%zu", index);
    });
});

6. dispatch_group:当两个线程都执行完成后,在汇总结果。

dispatch_grout_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) ^{ 
    // do sth...            
});
        
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) ^{
    // do sth...         
});

dispatch_group_notify(group, dispatch_get_main_queue()) ^{
    // 该group中的任务都完成后,该block才会执行。
});

7. dispatch_suspend/dispatch_resume 暂停和恢复运行

dispatch_suspend(group);
dispatch_resume(group);

继上述6的group之后,我们再来看一下暂停线程组和恢复线程组运行的两个API,当执行suspend之后,并不会影响已经提交的任务执行,之后暂停在suspend的之后提交的任务。而resume的作用为恢复线程组,使其继续执行。





© 著作权归作者所有

共有 人打赏支持
iossocket
粉丝 4
博文 19
码字总数 8603
作品 0
西安
程序员
GCD介绍(一): 基本概念和Dispatch Queue

什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写。从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将任务切分为多个单一任务...

于赟
2012/11/04
0
0
iOS 多线程GCD

一.简介 GCD (Grand Central Dispatch)是Apple开发的多核编程的解决方法。 二.优点 1.GCD可用于多核的并行运算 2.GCD自动利用更多CPU内核(双核,四核) 3.GCD自动管理线程的生命周期(创建线...

龙飞凤舞de心
02/23
0
0
iOS OS X 和 iOS 中的多线程技术-4.1 (GCD)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一、GCD 分发队列 GCD 分发队列是执行任务的有力工具。使用分发队列,你可以异步或者阻塞执行任意多个 block 的代码。你可以使用分发队列来执行...

石虎132
2017/12/04
0
0
iOS多线程之GCD

1.简介 什么是GCD 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多...

JlongTian
2016/01/08
74
0
多线程—GCD介绍

阅读原文请点击:file:///Users/feifanit/Downloads/iOS开发多线程篇—GCD介绍%20-%20文顶顶%20-%20博客园.html 一、简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中...

细雨微风轻诉流年
2016/09/07
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]python3快速入门教程1 turtle绘图-2函数

菲波那契序列: >>> # Fibonacci series:... # the sum of two elements defines the next... a, b = 0, 1>>> while b < 10:... print(b)... a, b = b, a+b...112......

python测试开发人工智能安全
今天
0
0
java环境变量配置最正确的方式

原贴:https://blog.csdn.net/qq_40007997/article/details/79784711,十分详细,亲测有效

kitty1116
今天
0
0
49.Nginx防盗链 访问控制 解析php相关 代理服务器

12.13 Nginx防盗链 12.14 Nginx访问控制 12.15 Nginx解析php相关配置(502的问题) 12.16 Nginx代理 扩展 502问题汇总 http://ask.apelearn.com/question/9109 location优先级 http://blog....

王鑫linux
今天
1
0
Nginx防盗链、访问控制、解析php相关配置、Nginx代理

一、Nginx防盗链 1. 编辑虚拟主机配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf 2. 在配置文件中添加如下的内容 { expires 7d; valid_referers none blocked server_names *.tes......

芬野de博客
今天
0
0
spring EL 和资源调用

资源调用 import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.PropertySource;import org.springframework.core.io.Resource;......

Canaan_
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部